Назад | Перейти на главную страницу

Утечка выполнения запроса в IIS 6.0, пока сервер не занят

У меня есть приложение, работающее на IIS 6, которое подвергается атаке сотен удаленных клиентов, выполняющих все виды запросов, некоторые из которых выполняются долго, а некоторые нет.

В некоторых развертываниях, в частности в настоящее время, Приложения ASP .NET - выполнение запросов counter просто продолжает расти, пока не достигнет предела (5000), а затем сервер перестанет принимать запросы.

Вот несколько очень интересных фактов при диагностике проблемы:

  1. Количество потоков в процессах w3p и в системном процессе низкое (менее 100)

  2. ЦП во всей системе низкий

  3. Общее количество TCP-соединений, перечисленных в netstat -a (в любом состоянии), составляет около 600, что ожидается, потому что у нас около 600 удаленных клиентов.

Итак, почему запрос, выполняемый в IIS, будет на уровне 5000, когда на самом деле ничего не происходит и все, кажется, запускается и завершается правильно?

РЕДАКТИРОВАТЬ

Хочу добавить, что это асинхронные вызовы с использованием шаблона IHttpAsyncHandler. Я считаю, что у них нет таймаута.

«В некоторых развертываниях» - что это значит?

Краткий ответ: потому что ваши рабочие потоки завязываются и зависают, а не тайм-аут.

Если это ASP.Net, потоки в розничный режим должно истечь через 120 секунд.

Поскольку их нет, либо есть что-то очень серьезно идет не так, или вы работаете в режиме отладки, то есть с <compilation debug="true"> установить где-нибудь в ваших файлах конфигурации (машина или web.config).

Это никогда не должно быть установлено на рабочем веб-сервере.

Если это не так, возьмите DebugDiag 1.2 и используйте его для оценки дампов памяти вашего приложения во время утечки потоков. Он должен иметь возможность показать вам стек потоков для просочившихся запросов на выполнение, и, надеюсь, это поможет вам понять и исправить проблему.

Вы заявляете:

выполнение всех видов запросов, некоторые из которых выполняются долго, а некоторые нет.

Долгие запросы в конечном итоге убьют ваш сервер. Если у вас их много, вы закончите с исчерпанием пула потоков и достижением максимального разрешенного количества запросов.

Если эти длительные запросы связаны с вводом-выводом (но не с процессором), например, с вызовом других веб-служб или ожиданием завершения операций SQL, рассмотрите возможность преобразования таких страниц в асинхронные страницы:

Асинхронные страницы ASP.NET и когда их использовать

Злой код: асинхронные страницы в ASP.NET 2.0

Выполнение асинхронной работы или задач в приложениях ASP.NET

Если вы используете ASP.NET MVC, вы можете сделать то же самое:

Использование асинхронного контроллера в ASP.NET MVC