Почему AppHostSvc иногда зависает при загрузке 100% процессора?
У меня есть сервер Windows Server 2008 R2 с IIS 7.5 и службой веб-приложений.
Я заметил, что svchost.exe
процесс потребляет много ресурсов процессора (все ядро процессора было на 100%). Этот конкретный процесс был хостом вспомогательной службы узла приложений IIS (AppHostSvc). Как только проблема начинается, не имеет значения, что делает сервер (в противном случае он может полностью простаивать, и служба будет загружать процессор).
Если я убиваю процесс, проблема исчезает - после автоматического перезапуска службы IIS использует минимальное количество процессорного времени.
Служба AppHostSvc отвечает за настройку истории узлов IIS и автоматически выполняет резервное копирование конфигурации (по-моему, каждые две минуты по умолчанию), я подумал, что, возможно, проблема начинается после изменения конфигурации IIS. Я попытался изменить некоторые параметры конфигурации, но это не имело никакого эффекта (даже после нескольких минут ожидания).
В конце концов я нашел, что вызывает это, но это похоже на ошибку. Смотрите мой собственный ответ ниже.
1 ответ
Оказывается, триггер имел "плохие" разрешения для каталога истории, используемого AppHostSvc (по умолчанию это %windir%\system32\inetsrv\History
)
Убедившись, что разрешения соответствуют настройкам по умолчанию, я запустилicacls /T /reset
в этом каталоге (и на нескольких других, в том числе inetsrv\config
) и проблема исчезла - AppHostSvc перестал сходить с ума от процессора.
Подробнее
Я взял свалку svchost.exe
процесс, когда AppHostSvc застрял в плохом состоянии. Один из потоков имел следующий стек вызовов:
ntdll.dll!NtClose()
KERNELBASE.dll!FindClose()
apphostsvc.dll!CONFIG_HISTORY_ENTITY::ScanHistoryDirectory(void)
apphostsvc.dll!CONFIG_HISTORY_ENTITY::TrimHistory(void)
apphostsvc.dll!CONFIG_HISTORY_ENTITY::SnapshotConfig(void)
apphostsvc.dll!CONFIG_HISTORY::SnapshotConfigFilesWorkItem(void)
apphostsvc.dll!CONFIG_HISTORY::ExecuteWorkItem(class MULTI_WORK_ITEM *)
apphostsvc.dll!MultiWorkQueueWorkCallback(struct _TP_CALLBACK_INSTANCE *,void *)
ntdll.dll!TppSimplepExecuteCallback()
ntdll.dll!TppWorkerThread()
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
Имя функции ScanHistoryDirectory
предполагает, что он пытается сканировать каталог истории (дух). Я подозревал, что некоторые права доступа были в этом каталоге, поэтому я попытался восстановить их по умолчанию.