У меня есть служба WCF (написанная на .NET 4), работающая под IIS 7.5 в 64-разрядной версии Windows 2008 R2.
Я создал тестовый инструмент, который порождает 10-20 (или более) потоков - каждый поток создает случайную полезную нагрузку и попадает на сервер. На сервере я регистрирую все обращения и вижу идентификаторы потоков, задействованных в IIS.
Независимо от того, сколько клиентских запросов попадает на сервер (одновременно), сервер использует только 2 потока. Это в основном циклическое переключение между ними.
Но затем, совершенно неожиданно, IIS начнет использовать столько потоков, сколько запросов, которые я ему бросаю. А позже он перейдет к использованию 1 или 2 потоков.
Может ли кто-нибудь объяснить такое поведение и что я могу сделать, чтобы его исправить?
Вы определенно достигли установленного по умолчанию ограничения в 2 соединения system.net. Итак, вам нужно увеличить maxConnection, разрешенное для каждого IP-адреса, до количества потоков.
<configuration>
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
</configuration>
Если у вас Windows 7, то вы достигнете максимума в 25 запросов в IIS. Вам нужно будет выполнить нагрузочный тест в Windows 2008, чтобы получить реальное число.
Другое дело, что клиент может не выполнять все потоки параллельно. Итак, вам нужно убедиться, что клиент действительно выполняет все 100 потоков параллельно.
Помимо этих настроек, чтобы масштабировать WCF, вам необходимо произвести дополнительную настройку. Здесь описаны наиболее распространенные настройки:
http://www.codeproject.com/Articles/133738/Quick-Ways-to-Boost-Performance-and-Scalability-of
Как насчет настройки параметров управления клиентским подключением,
<configuration>
<system.net>
<connectionManagement>
<add address = "http://www.example.org" maxconnection = "4" />
<add address = "*" maxconnection = "2" />
</connectionManagement>
</system.net>
</configuration>