Конфликт, низкая производительность и взаимоблокировки при отправке запросов веб-службы из ASP.NET
Недавно я развернул веб-приложение, которое использует множество вызовов веб-служб. Во время deveolpment я не заметил какой-либо тупиковой ситуации или споров, но теперь, когда веб-сайт работает и активно посещается, я получаю эту ошибку в своем журнале событий пару раз в день, и веб-сайт также зависает / зависает, так что мне приходится перезагружать IIS,
Пул приложений "Default AppPool" превысил свои ограничения на работу.
Я нашел некоторую информацию на этом сайте http://support.microsoft.com/kb/821268, которая выглядит многообещающей, но мне нужна некоторая помощь в отношении значений параметров.
Я думаю о настройке этих параметров:
* maxWorkerThreads
* minWorkerThreads
* maxIoThreads
* minFreeThreads
* minLocalRequestFreeThreads
* maxconnection
* executionTimeout
Сначала говорится, что я должен сделать их в Machine.configm, но не могу ли я просто сделать их в Web.config?
Во-вторых, какие будут рекомендованные настройки, чтобы решить мою проблему с разногласиями? Мой (виртуальный) веб-сервер работает в следующей конфигурации системы:
Я также знаю, что для окончательного решения этой проблемы мне, возможно, придется что-то делать с моим кодом, добавлять кеширование и т. Д. Я приветствую советы по этому вопросу.
2 ответа
Ваша ссылка на КБ относится только к версии 2.0 и более ранним версиям.NET Framework.
Обычно на веб-сайте ASP.NET, подключающемся к веб-службам, не возникает взаимоблокировок. Поэтому весьма вероятно, что если вы используете пользовательскую блокировку в коде (или сторонней библиотеке), это может быть причиной. Поэтому важно докопаться до сути.
Увеличение количества потоков может повысить производительность, если это является узким местом. Это очень маловероятно, чтобы помочь с взаимоблокировками потоков.
С точки зрения решения, один параметр, который имеет первостепенное значение, это maxConnection, который по умолчанию равен 2, что означает, что вы можете одновременно выполнять только 2 вызова веб-службы.
Также посмотрите на это.
Благодаря Aliostad и http://www.guidanceshare.com/wiki/ASP.NET_2.0_Performance_Guidelines_-_Threading я теперь настроил свой Web.config и добавил следующие настройки:
<httpRuntime maxRequestLength="30000" minFreeThreads="88" minLocalRequestFreeThreads="76" />
<processModel maxIoThreads="100" maxWorkerThreads="100" />
<connectionManagement>
<add address="*" maxconnection="48" />
</connectionManagement>
Это выглядит хорошо? Я не уверен, почему я добавил maxRequestLength="30000", но так было некоторое время. Может ли это быть проблемой, что она достигает 30000?
РЕДАКТИРОВАТЬ: Похоже, я не могу добавить тег tge processModel в мой Web.config, я получаю эту ошибку: