IIS HTTP 503 Service Unavailable: Queue Full — устранение переполнения
Симптомы переполнения очереди IIS (HTTP 503)
Веб-сервер IIS перестает отвечать на входящие клиентские запросы и возвращает в браузер ошибку HTTP Error 503. The service is unavailable. В журнале HTTPERR (C:\Windows\System32\LogFiles\HTTPERR\httperr*.log) регистрируются записи с причиной QueueFull или AppOffline.
| Симптом | Где фиксируется | Причина |
|---|---|---|
| HTTP 503 QueueFull | Журнал HTTPERR | Очередь запросов пула приложений в драйвере HTTP.sys заполнена на 100% |
| Пул приложений работает, но сайт не отвечает | IIS Manager | Рабочий процесс w3wp.exe не успевает обрабатывать входящие соединения |
| Высокая очередь запросов | Системный монитор (perfmon) | Зависание запросов к медленной внешней базе данных или API |
Пошаговое устранение переполнения очереди в IIS
- Увеличьте лимит длины очереди пула приложений (Queue Length): по умолчанию размер очереди составляет 1000 запросов. Для высоконагруженных сайтов увеличьте его до 5000–10000:
Import-Module WebAdministration; Set-ItemProperty "IIS:\AppPools\ИмяПула" -Name "queueLength" -Value 5000 - Увеличьте лимит соединений на уровне драйвера ядра HTTP.sys:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\HTTP\Parameters" -Name "EnableAggressiveMemoryUsage" -Value 1 -Type DWord -Force; Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\HTTP\Parameters" -Name "MaxConnections" -Value 100000 -Type DWord -Force - Определите зависшие запросы в реальном времени:
& "$env:SystemRoot\System32\inetsrv\appcmd.exe" list requests /elapsed:5000 - Увеличьте количество рабочих процессов (Web Garden), если приложение не привязано к сессиям в памяти: увеличьте параметр
Maximum Worker Processesс 1 до 2–4.
Важно: Простое увеличение очереди маскирует проблему, если веб-приложение зависает из-за дедлоков в SQL. Обязательно устраните задержки в бэкенд-коде.
Частые вопросы (FAQ)
В чем разница между журналами IIS W3C и журналом HTTPERR?
Журналы IIS пишутся процессом w3wp.exe при обработке сайтом. Журнал HTTPERR пишется драйвером ядра HTTP.sys, когда запрос отброшен до попадания в пул приложений.
Почему увеличение Queue Length может привести к нехватке памяти?
Каждый удерживаемый в очереди запрос занимает буфер в невыгружаемом пуле оперативной памяти ядра (Non-Paged Pool).
Как быстро очистить зависшую очередь запросов пула?
Выполните команду Restart-WebAppPool -Name 'ИмяПула' в PowerShell.
Что означает причина Connections_Refused в HTTPERR?
Это означает, что достигнут лимит максимального количества одновременных TCP-соединений, разрешенных на сайте.