Потерянные запросы IIS

У нас есть IIS 7, на котором запущено классическое приложение ASP, и в последнее время я заметил следующую проблему. В течение дня, если я смотрю на Server Node -> Worker Processes, некоторые запросы, кажется, заполняются там. Затраченное время - что-то сумасшедшее, например, 12 часов в конце дня. Все запросы находятся на этапе ExecuteRequestHandler.

Нет никакого способа, чтобы что-то выполнялось так долго, и я не могу воспроизвести проблему. Я пробовал сбросить файл w3wp.exe, используя FRT и прочие полезные вещи, но у меня есть несколько общих вопросов:

  1. Есть ли параметр, который контролирует КОГДА IIS останавливает запрос? Чтобы быть конкретным, в процессе разработки, если я намеренно проектирую страницу так, чтобы она была медленной (т.е. обновляла заблокированную таблицу SQL), а затем ЗАКРЫВАЛАСЬ из браузера и отслеживала запросы в IIS, я вижу, что запрос все еще находится там около 20 секунд до удаления. Это 20 секунд случайный интервал, или это можно где-то УСТАНОВИТЬ? Чтобы было ясно, это не значит, что страница занимает 20 секунд для выполнения, она будет выполняться вечно (в этом тестовом примере), но кажется, что IIS отказывается от нее через 20 секунд или около того после того, как я выхожу из системы.
  2. Есть ли способ увидеть "осиротевшие" запросы, И.Е. запросы в пуле приложений, которых больше никто не ждет
  3. Что еще я могу сделать, чтобы отладить это? В дампе w3wp говорится, что существуют клиентские соединения с состоянием HTTP-запроса HTR_READING_CLIENT_REQUEST.
  4. Я продолжаю получать предложения по изменению настроек конфигурации IIS, таких как AspRequestQueueMax, каждый раз, когда я пытаюсь найти их в ApplicationHost.config, я не вижу, чтобы эти элементы были установлены, поэтому либо я смотрю не в том месте, либо значение по умолчанию будет не должны быть явно указаны в конфиге. Это вызывает два вопроса: а) как вы ЧИТАЕТЕ эти значения конфигурации, т.е. получаете текущее значение, б) как вы их УСТАНАВЛИВАЕТ.

person Shalom Slavin    schedule 09.09.2014    source источник
comment
На случай, если кто-нибудь наткнется на это, ответ на №4 заключается в том, что если его нет в конфигурации, он полагается на значение по умолчанию, и многие из настроек находятся в самом IIS. Для queuemax вы устанавливаете это на серверном узле - ›asp -› раздел свойств ограничений, то же самое для потоков на процессор, что является еще одним параметром, который я искал.   -  person Shalom Slavin    schedule 28.10.2014


Ответы (1)


Классический запрос ASP будет выполняться до тех пор, пока не истечет время ожидания сценария, независимо от того, подключен клиент или нет. Я считаю, что значение по умолчанию составляет 90 секунд, но файл .ASP может переопределить это, установив свойство Server.ScriptTimeout напрямую (что довольно часто). Если ваша очередь запросов заполняется, это, вероятно, причина, и изменение значений по умолчанию не поможет.

Если вы можете редактировать код ASP, вы можете добавить подобную логику в потенциально длинные разделы:

If Not Response.IsClientConnected Then Call Response.End()

Вы также можете выполнить глобальный поиск в коде Server.ScriptTimeout, чтобы понять, откуда исходит злоупотребление.

Если вы действительно хотите изменить тайм-аут сценария по умолчанию, он хранится здесь: https://www.iis.net/configreference/system.webserver/asp/limits

Чтобы изменить через графический интерфейс IIS7, перейдите по ссылке: (веб-сайт)> (представление функций)> (категория «IIS»)> «ASP»> разверните узел «Свойства ограничений»> «Тайм-аут сценария»

person modal_dialog    schedule 04.11.2015
comment
Спасибо, это дает мне возможность поработать. Как это может работать для Response.IsClientConnected? Если код находится в строке, скажем, 1200, и там что-то давно работает, как он вообще сможет добраться до строки 1201, чтобы выполнить это условие? И если он МОЖЕТ добраться до линии 1201, значит, он не застрял. Я что-то упускаю? - person Shalom Slavin; 20.11.2015
comment
@Shalom: обычно уловка состоит в том, чтобы найти достаточно низкие места в коде, чтобы каждая строка представляла собой короткую задачу. Иногда вам, возможно, придется немного переделать дизайн. Например; если у вас есть одна строка, которая копирует 1000 файлов и возвращает. Возможно, вам придется переписать этот код, чтобы копировать по одному файлу за раз в цикле. Затем вы можете добавить IsCliientConnected в этот цикл. - person modal_dialog; 21.11.2015