I have a WCF service running InstanceContextMode = PerCall, ConcurrencyMode = Multiple, TCP and is hosted in Selfhost(Windows Service) and IIS7/IIS8.
The throttling is set to this :
<serviceThrottling maxConcurrentCalls="2000" maxConcurrentSessions="2147483647" maxConcurrentInstances="2000"/>
And the binding looks like this :
<binding name="netTcpRegular" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="01:00:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="1000" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="200" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<reliableSession ordered="true" inactivityTimeout="infinite" enabled="false"/>
<security mode="None">
<transport clientCredentialType="None"/>
</security>
</binding>
We are keeping state at the serivce so every user will have there own objects that is fetched on every call.
The question is how many concurrent users (sessions) can we have with these settings and what settings is affecting this?
It depends how many concurrent calls a single client makes at any one time – ie if it makes 5 calls on 5 different threads then your maxconcurrentusers value will be 5 times larger than the number of sessions it can handle. As you’re using InstanceContextMode = PerCall then you’ll find that WCF will take the lower of maxConcurrentCalls and maxConcurrentInstances for the number of instances it creates anyway.
So if you have just one call per client being made at any one time, number of sessions you have from the values you’ve given is 2000.
If you make 5 concurrent calls per client then you should set it to 400.
Quite often trial & error in a load test is the best way forward here.
A good example here — http://blogs.msdn.com/b/rickrain/archive/2009/06/26/wcf-instancing-concurrency-and-throttling-part-3.aspx