Детализированная отчетность по производительности svchost.exe
Это то, что всегда беспокоило меня, поэтому я спрошу сообщество Server Fault.
Мне нравится Process Explorer за то, что он отслеживает не только задачи высокого уровня, которые вы получаете в диспетчере задач. Но я постоянно хочу знать, какой из этих дюжин сервисов, размещенных в одном процессе под svchost, вызывает всплеск моего процессора.
Итак... есть ли ненавязчивый способ выяснить эту информацию?
6 ответов
Да, есть (почти) ненавязчивый и простой способ:
Разделите каждую службу для запуска в своем собственном процессе SVCHOST.EXE, и служба, использующая циклы ЦП, будет легко видна в Process Explorer (пробел после "=" необходим):
SC Config Servicename Type= own
Сделайте это в окне командной строки или поместите в сценарий BAT. Требуются права администратора и перезагрузка компьютера, прежде чем он вступит в силу.
Исходное состояние может быть восстановлено:
SC Config Servicename Type= share
Пример: чтобы инструментарий управления Windows работал в отдельном файле SVCHOST.EXE:
SC Config winmgmt Type= own
Эта техника не имеет никаких побочных эффектов, за исключением, возможно, незначительного увеличения потребления памяти. Помимо наблюдения за загрузкой ЦП для каждой службы, она также позволяет легко отслеживать дельту ошибок страниц, скорость чтения дискового ввода-вывода и скорость записи дискового ввода-вывода для каждой службы. Для Process Explorer, меню View/Select Columns: вкладка Process Process /Page Fault Delta, вкладка Performance Process /IO Delta Write Bytes, вкладка Performance Process /IO Delta Read Bytes, соответственно.
В большинстве систем есть только один процесс SVCHOST.EXE, который имеет много сервисов. Я использовал эту последовательность (ее можно вставить прямо в окно командной строки):
rem 1. "Automatic Updates"
SC Config wuauserv Type= own
rem 2. "COM+ Event System"
SC Config EventSystem Type= own
rem 3. "Computer Browser"
SC Config Browser Type= own
rem 4. "Cryptographic Services"
SC Config CryptSvc Type= own
rem 5. "Distributed Link Tracking"
SC Config TrkWks Type= own
rem 6. "Help and Support"
SC Config helpsvc Type= own
rem 7. "Logical Disk Manager"
SC Config dmserver Type= own
rem 8. "Network Connections"
SC Config Netman Type= own
rem 9. "Network Location Awareness"
SC Config NLA Type= own
rem 10. "Remote Access Connection Manager"
SC Config RasMan Type= own
rem 11. "Secondary Logon"
SC Config seclogon Type= own
rem 12. "Server"
SC Config lanmanserver Type= own
rem 13. "Shell Hardware Detection"
SC Config ShellHWDetection Type= own
rem 14. "System Event Notification"
SC Config SENS Type= own
rem 15. "System Restore Service"
SC Config srservice Type= own
rem 16. "Task Scheduler"
SC Config Schedule Type= own
rem 17. "Telephony"
SC Config TapiSrv Type= own
rem 18. "Terminal Services"
SC Config TermService Type= own
rem 19. "Themes"
SC Config Themes Type= own
rem 20. "Windows Audio"
SC Config AudioSrv Type= own
rem 21. "Windows Firewall/Internet Connection Sharing (ICS)"
SC Config SharedAccess Type= own
rem 22. "Windows Management Instrumentation"
SC Config winmgmt Type= own
rem 23. "Wireless Configuration"
SC Config WZCSVC Type= own
rem 24. "Workstation"
SC Config lanmanworkstation Type= own
rem End.
Хотя я не знаю простого способа сделать это напрямую, вы часто можете найти его на странице свойств Process Explorer для процесса svchost. На вкладке "Службы" в свойствах процесса будет указано, какие службы размещены в этом процессе. А вкладка Threads покажет вам потоки и стеки потоков, а также их загрузку процессора. Часто начальный адрес в потоке будет указывать на DLL точки входа, и, соответственно, на службу, работающую в этом потоке. В других случаях вы можете посмотреть на стек вызовов и увидеть имя модуля в стеке вызовов, которое говорит вам, какой фрагмент кода выполняется.
Предостережение: Пожалуйста, примите необходимые исследования, точки восстановления и процедуры резервного копирования, прежде чем применять это, а также убедитесь, что все еще работает после этого. Восстановиться после этого можно через Среду восстановления только в системах без RAID, а также в безопасном режиме как в системах RAID, так и в других системах. Это было проверено на компьютере разработчика, а не на серверах.
В Powershell вы можете сделать это для всех не-lsass-сервисов, используя следующие команды:
Get-Service | ForEach-Object `
{ SC.EXE config $_.Name type= own }
ForEach ($svc in @("efs", "keyiso", "netlogon", "policyagent", "samss", "vaultsvc", `
"was", "w3svc")) `
{ SC.EXE config $svc type= share }
Список, который здесь исключен, должен быть запущен в общем lsass.exe, за исключением агента политики, который требуется для правильной связи агента групповой политики во время загрузки.
Также недавно обнаружилось, что (Process Activation) и w3svc (IIS World Wide Web) необходимо обмениваться своими процессами, поэтому они были добавлены в исключения.
Это было протестировано в Windows 10 (1607, сборка 14393.953), исключения в XP, ... отличаются.
Попробуйте инструмент Service Disclosure. Это:
- Хранит службы, которые совместно используют процесс svchost.exe.
- Настраивает службы для запуска в отдельном процессе. После перезагрузки вы увидите каждый сервис в отдельном процессе.
- Возвращает все сохраненные на шаге 1 сервисы обратно одному процессу.
Ваши комментарии и предложения приветствуются.
@ Питер Мортенсен: Спасибо за идею.
В настоящее время вы можете использовать PowerShell, чтобы изменить типы служб на "Собственный процесс" и просмотреть память для каждого из них в отдельности. Это Гист показывает полный код. Основная идея заключается в попытке изменить тип сервиса с наименее навязчивого на наиболее навязчивый способ:
$win32Service = Get-CimInstance -ClassName Win32_Service -Filter "Name = '$ServiceName'" -Verbose:$false
if ($win32Service)
{
if (!(Set-ServiceTypeToOwnProcessByCim $win32Service))
{
if (!(Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service))
{
if (Grant-FullControlRightsOnServiceRegistryKeyToCurrentUser $win32Service)
{
Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service | Out-Null
}
}
}
}
else
{
Write-Warning "[$ServiceName] Service not found"
}
При помещении Set-ServiceTypeToOwnProcess.ps1
а также Enable-Privilege.ps1
файлы в той же папке, вы можете выполнить скрипт следующим образом:
.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
Я не знаю, если это все еще вопрос, на который вы хотите получить ответы, но, устраняя ошибку svchost клиента, я узнал, что для этого есть командная строка: "tasklist /svc". Это дает полный список запущенных процессов, с идентификатором процесса и сервисами, которые запускает каждый процесс. Это не дает использовать процессор, но вы можете закрывать их по одному процессу за раз по идентификатору процесса и узнать, по крайней мере, какая группа сервисов засоряет ваш процессор.