By default WCF accepts only 10 concurrent sessions which is not enough for most applications. If there are 20 clients then 10 of them will be blocked until their requests time out. You can always increase the number of sessions
but this is going to work as long as you control all the clients. If you don't then some of them might not properly close their sessions which next might lead to a resource leak on the service side. This is not an easy problem to solve unless you are ready and able to abandon sessions.
From my perspective it's much more important to know that a service is about to reach it's limit of sessions or it is hung because it already has reached it. Unfortunately as far as I know there is no out of the box way of monitoring the number of active sessions per WCF service using Performance Counters. This leaves us with only one option, namely we have to write a custom performance counter on our own. This can be done as a WCF extension that implements IChannelInitializer
When a service seems to be frozen the story is not that simple as there might be dozens of reasons why it is in such a state. The only way I know to prove or disprove that the problem is related to the fact that there are no available sessions is to create a memory snapshot of the process where the service is hosted in and use Debugging Tools for Windows
to check the state of all ServiceThrottle
The following steps shows how to carry out such an investigation :) :0.
Install Debugging Tools for Windows
and copy C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll (extension for .NET debugging) to the folder where Debugging Tools for Windows
Find the id of the process that is hosting the WCF service we are examining. In my case it is one of the IIS worker processes.2.
Create a memory snapshot using the adplus
script which is part of Debugging Tools for Windows
. By default adplus
creates all snapshots under the folder where the Debugging Tools for Windows
is installed. 3.
(the same location as adplus
) and open the memory snapshot.4.
Type .load sos
and press enter to load sos.dll
Type !dumptheap -type ServiceThrottle -short
in the command line to list all objects of type ServiceThrottle
that exist on the managed heap. By the list of all objects I mean a list of their addresses in memory.6.
For each address on the output list carry out steps 7 - 87.
Type !do address of the object
to see what's inside of it.
8. The ServiceThrottle
object has bunch of fields but only one of them which is called sessions
is interesting from our perspective. Type !do address of the sessions field
to see what's inside of it.
If you find a sessions field that has count
fields set to the same value then you know that the pool of available sessions has been exhausted. If you can't find it then at least you know that there is something else wrong with your service.
Happy debugging :)