Multiple worker processes for a single application in a applicationpool

  • Thread starter Abhishek Srivastava
  • Start date
A

Abhishek Srivastava

Hello All,

In IIS 6.0 We have a concept of worker processes and application pools.

As I understand it, we can have multiple worker process per appliction
pool. Each worker process is dedicated to a pool. If I assign only one
application to a applicaton pool and have multiple worker processes
assigned to that pool. Will my application be processed by many worker
processes?

Why I am asking this question is because there are certain resources
which are in-memory and are shared at an application level. For example
the database connection pool, or some XML files initialized via a static
contructor.

Now if multiple process are executing my requests, then how do they
share data (if they do at all). Or each process replicates its own
resources.

This is important to me, because lets say I am connection to a
datasource for which I have a 20 concurrent user license. So I create a
pool of 20 connections and manage it. This pool is in-memory initialized
via a static constructor. Now if each worker process tries to load its
own in-memory pool, then only one process would function because rest
will be denied the connection. I also have no way of knowing how many
worker process will run at any moment because they are run based on
demand by the IIS so I cannot split the load amongst multiple processes
at an application level.

To me it appears that different worker processes cannot be used to
execute the requests for one application ... but then MS documentation
talks about Web Garden where different worker processes execute requests
for an application domain.

I will be very gratefull if you could share some knowledge on this
matter. Thanks for your help in advance.

regards,
Abhishek.
 
K

Ken Schaefer

Each worker process keeps its own in-memory state. You would need some kind
of out-of-process state management if you want to share data between
processes.

Additionally, I would suggest that you are best of managing database
connections via built-in MDAC connection pooling, not through your own
home-grown system. You can limit the number of connections in the pool.

Cheers
Ken

: Hello All,
:
: In IIS 6.0 We have a concept of worker processes and application pools.
:
: As I understand it, we can have multiple worker process per appliction
: pool. Each worker process is dedicated to a pool. If I assign only one
: application to a applicaton pool and have multiple worker processes
: assigned to that pool. Will my application be processed by many worker
: processes?
:
: Why I am asking this question is because there are certain resources
: which are in-memory and are shared at an application level. For example
: the database connection pool, or some XML files initialized via a static
: contructor.
:
: Now if multiple process are executing my requests, then how do they
: share data (if they do at all). Or each process replicates its own
: resources.
:
: This is important to me, because lets say I am connection to a
: datasource for which I have a 20 concurrent user license. So I create a
: pool of 20 connections and manage it. This pool is in-memory initialized
: via a static constructor. Now if each worker process tries to load its
: own in-memory pool, then only one process would function because rest
: will be denied the connection. I also have no way of knowing how many
: worker process will run at any moment because they are run based on
: demand by the IIS so I cannot split the load amongst multiple processes
: at an application level.
:
: To me it appears that different worker processes cannot be used to
: execute the requests for one application ... but then MS documentation
: talks about Web Garden where different worker processes execute requests
: for an application domain.
:
: I will be very gratefull if you could share some knowledge on this
: matter. Thanks for your help in advance.
:
: regards,
: Abhishek.
 
A

Abhishek Srivastava

How do the workers synchronize the data? suppose I keep a DOM tree in
the application object.

Now one worker process updates a node in the dom tree. Will other worker
processes (who have thier own version of the in-memory state) see the
changes? What is the mechanism of synchronization.

One question about MDAC. Is MDAC an out-of-process thing? AFAIK, it is a
set of DLLs which run in the memory of the application.(Used MDAC many
times... but never saw a separate exe or DLLHOST begining to run upon
querying my DB) Even if I let the MDAC manage my pool, if multiple
processes are creating their own pools, then what is the total number of
connections beging opened to the database? If I have a limitation on the
max number of connections, then how do I manage it?

Can you please confirm that multiple processes can definetly run execute
the requests for a single application.

regards,
Abhishek.
 
J

Jerry III

The fact that MDAC does not have it's process does not mean that it can't
share connection pools across different applications. I don't know how you
came to that conclusion.

Jerry
 
S

Scott Allen

Jerry: To share a connection from an exisitng pool you need to be in
the same process, have the same security context, and use the exact
same connection string as the pool. In .NET you also need to be in the
same app domain which can further subdivide a process.
 
J

Jerry III

You're kidding, right? What good is connection pooling if it can't be shared
across multiple instances of the same code? How exactly are we supposed to
tune the connection pool size if we (as developers) have no idea how many
connection pools are there going to be since some customers will setup their
web site to run in multiple processes?

Jerry
 
S

Scott Allen

Well, I guess it boils down to this:

It's close to impossible to write a web app without connection
pooling. The overhead of seting up, handshaking, authenticating,
tearing down, etc., is a big hit on perf and scalability.

I could write my own pooling algorithm, but some smart people already
worked on the problem for me and did a tremendous amount of testing.
The pooling in most managed providers is already effecient, secure,
and well behaved.

The built in pooling won't "waste" connections. That is, it wont open
more than it needs at any one moment (unless you've given it a minimum
number to use), and with most of the providers you can set a min and
max pool size. If the pool reaches the max size, additional requests
queue up and wait for a connection to become free.

Now, I realize this doesn't help someone control the *total* number of
connections from thier code in cases where a data access layer appears
in more > 1 processes on a server, but, it is suprising how many
"active" users a .NET app can support when the application is using
then returning a connection to the pool as quickly as possible. With n
connections in a pool an app can service the requests of n or more
users, generally a 'lot' more than n, but again it depends on the
application. You just have to test and benchmark and test again.

If I was in a scenario where I needed to have total control over the
number of connections on a machine, I'd write a ServicedComponent for
data access and host it in a COM+ server package. Of course this would
require marshalling of DataSets across processes, which can be a hit.
I'd think this type of scenario is an exceptional case, but I'm sure
it exists somewhere.
 
K

Ken Schaefer

A given worker process can have multiple threads servicing requests. These
will all share the same connection pool. I don't understand how two
arbitrary w3wp.exe processes would share the same connection pool however.

If you're writing an application that requires multiple w3wp.exe (web
garden), then you probably already have a internet connector-type licence
for SQL Server (rather than 10 CALs or similar). The connection pooling
provided by the MDAC components is quite good IMHO.

Cheers
Ken


: You're kidding, right? What good is connection pooling if it can't be
shared
: across multiple instances of the same code? How exactly are we supposed to
: tune the connection pool size if we (as developers) have no idea how many
: connection pools are there going to be since some customers will setup
their
: web site to run in multiple processes?
:
: Jerry
:
: : > Jerry: To share a connection from an exisitng pool you need to be in
: > the same process, have the same security context, and use the exact
: > same connection string as the pool. In .NET you also need to be in the
: > same app domain which can further subdivide a process.
: >
: > --
: > Scott
: > http://www.OdeToCode.com
: >
: > On Fri, 30 Jan 2004 10:26:12 -0800, "Jerry III" <[email protected]>
: > wrote:
: >
: > >The fact that MDAC does not have it's process does not mean that it
can't
: > >share connection pools across different applications. I don't know how
: you
: > >came to that conclusion.
: > >
: > >Jerry
: > >
: > >: > >> How do the workers synchronize the data? suppose I keep a DOM tree in
: > >> the application object.
: > >>
: > >> Now one worker process updates a node in the dom tree. Will other
: worker
: > >> processes (who have thier own version of the in-memory state) see the
: > >> changes? What is the mechanism of synchronization.
: > >>
: > >> One question about MDAC. Is MDAC an out-of-process thing? AFAIK, it
is
: a
: > >> set of DLLs which run in the memory of the application.(Used MDAC
many
: > >> times... but never saw a separate exe or DLLHOST begining to run upon
: > >> querying my DB) Even if I let the MDAC manage my pool, if multiple
: > >> processes are creating their own pools, then what is the total number
: of
: > >> connections beging opened to the database? If I have a limitation on
: the
: > >> max number of connections, then how do I manage it?
: > >>
: > >> Can you please confirm that multiple processes can definetly run
: execute
: > >> the requests for a single application.
: > >>
: > >> regards,
: > >> Abhishek.
: > >>
: > >> Ken Schaefer wrote:
: > >> > Each worker process keeps its own in-memory state. You would need
: some
: > >kind
: > >> > of out-of-process state management if you want to share data
between
: > >> > processes.
: > >> >
: > >> > Additionally, I would suggest that you are best of managing
database
: > >> > connections via built-in MDAC connection pooling, not through your
: own
: > >> > home-grown system. You can limit the number of connections in the
: pool.
: > >> >
: > >> > Cheers
: > >> > Ken
: > >> >
: message
: > >> > : > >> > : Hello All,
: > >> > :
: > >> > : In IIS 6.0 We have a concept of worker processes and application
: > >pools.
: > >> > :
: > >> > : As I understand it, we can have multiple worker process per
: appliction
: > >> > : pool. Each worker process is dedicated to a pool. If I assign
only
: one
: > >> > : application to a applicaton pool and have multiple worker
processes
: > >> > : assigned to that pool. Will my application be processed by many
: worker
: > >> > : processes?
: > >> > :
: > >> > : Why I am asking this question is because there are certain
: resources
: > >> > : which are in-memory and are shared at an application level. For
: > >example
: > >> > : the database connection pool, or some XML files initialized via a
: > >static
: > >> > : contructor.
: > >> > :
: > >> > : Now if multiple process are executing my requests, then how do
they
: > >> > : share data (if they do at all). Or each process replicates its
own
: > >> > : resources.
: > >> > :
: > >> > : This is important to me, because lets say I am connection to a
: > >> > : datasource for which I have a 20 concurrent user license. So I
: create
: > >a
: > >> > : pool of 20 connections and manage it. This pool is in-memory
: > >initialized
: > >> > : via a static constructor. Now if each worker process tries to
load
: its
: > >> > : own in-memory pool, then only one process would function because
: rest
: > >> > : will be denied the connection. I also have no way of knowing how
: many
: > >> > : worker process will run at any moment because they are run based
on
: > >> > : demand by the IIS so I cannot split the load amongst multiple
: > >processes
: > >> > : at an application level.
: > >> > :
: > >> > : To me it appears that different worker processes cannot be used
to
: > >> > : execute the requests for one application ... but then MS
: documentation
: > >> > : talks about Web Garden where different worker processes execute
: > >requests
: > >> > : for an application domain.
: > >> > :
: > >> > : I will be very gratefull if you could share some knowledge on
this
: > >> > : matter. Thanks for your help in advance.
: > >> > :
: > >> > : regards,
: > >> > : Abhishek.
: > >> >
: > >> >
: > >
: >
:
:
 
A

Abhishek Srivastava

Thanks everyone for replying. Does anyone know someone who has much more
internal knowledge of IIS ?

If different worker process run in full isolation from each other, then
application programmers must be careful in managing static resources.
because updates made in one process may not be visible to another.

If the processes do talk to one another and synchronize data from time
to time, then we must know some details about how this is being done.
Otherwise the application can behave unpredictably because of data
synchronization issues.

Take another example:

I make a request to the IIS and wp1 picks up the request from the
http.sys queue for the first time. When next call was made wp2 picks up
the request from the queue. But wp2 does not have my session data so it
cannot process my second request.

If the data from wp1 is replicated to wp2 (by some unknown means) then
it would bean that each worker process replicates its data into all
other worker processes. This would really impact scalability of each
worker process.

The other solution can be that there is a worker process sticky-ness. so
that the request goes to the same worker process which had the session.
But this would defeat the purpose of having a http.sys queue based
request processing approach.

So unless something very magical is happening inside, I feel that only
one worker process can process requests for a application (the worker
process can be shared by many applications inside the same application
pool). I also discussed this with a friend who felt that the concept of
web-garden means multiple "processors" (CPU) not multiple processes.

I am really confused now.... please advise.

regards,
Abhishek.
 
A

Ashish

Jerry said:
The fact that MDAC does not have it's process does not mean that it can't
share connection pools across different applications. I don't know how you
came to that conclusion.

Jerry
just for my knowledge, does mdac or ado.net operates on some shared
memory between processes ?
how can i see how much that shared memory is

we are running an web application and trying to chase some lost memory,
some people have also talked about some issue recognised by microsoft as
abug ( gc not returning large object heap to OS ) . but i did not find
any article on microsofts website on this

Thanks
-ashish
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top