Я занимался исследованиями, и я считаю, что нашел приемлемый ответ. Мой первоисточник - эта статья: http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx
Как я понимаю, есть два основных способа регулирования обработки запросов. Первым является свойство MaxConcurrentRequestsPerCPU. До .NET 4 по умолчанию было установлено значение 12. В .NET 4 оно было изменено на 5000. Для асинхронных запросов они хотели многое разрешить, а для синхронных запросов они считают, что ASP.NET ThreadPool будет достаточно эффективно регулировать синхронные запросы. Вторым, конечно, является сам ThreadPool. После того, как ASP.NET отправит запрос туда, он может решить, когда он пойдет.
Если вы выполняете асинхронную обработку, вашими ограничивающими факторами, вероятно, будут процессор, сеть и диск, а не регулирование запросов ASP.NET. Возможно, он достигнет предела MaxConcurrentRequestsPerCPU, но этот предел действительно высок.
Если вы выполняете синхронную обработку и блокировку веб-вызовов в течение длительных периодов времени, гораздо более вероятно, что вы столкнетесь с этими ограничениями. MaxConcurrentRequestsPerCPU - это то, на что нужно обращать внимание до .NET 4, но все еще есть ThreadPool.
Тестирование производительности
Я собрал простой тест, чтобы увидеть, как работает это регулирование. У меня есть простая страница с вызовом Thread.Sleep () 500 мс. Один хост-компьютер выполняет одновременно 800 асинхронных запросов, а рабочий компьютер, на котором работает ASP.NET, обрабатывает их все. Результаты были интересны:
.NET 3.5, без изменений: 46 секунд. Видел 9 рабочих потоков с помощью проводника процессов.
.NET 3.5 с MaxConcurrentRequestsPerCPU, установленным в 5000: 46 секунд. 9 рабочих потоков.
.NET 4: 42 секунды или 13 секунд при перегреве. Пила около 35 рабочих потоков постепенно создаются.
.NET 4, асинхронный: 3 секунды
Несколько замечаний:
- MaxConcurrentRequestsPerCPU не получил удар. Похоже, это было ограничение самого ThreadPool.
- .NET 3.5, похоже, неохотно создает новые потоки для обработки синхронных запросов. .NET 4 намного лучше справляется с нагрузкой.
- Асинхронный по-прежнему лучший на милю страны.