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

Подробный отчет о производительности svchost.exe

Это то, что меня всегда беспокоило, поэтому я спрошу сообщество Server Fault.

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

Итак ... есть ли какой-нибудь ненавязчивый способ узнать эту информацию?

Да, есть (почти) ненавязчивый и простой способ:

Разделите каждую службу для запуска в ее собственном процессе SVCHOST.EXE, и служба, потребляющая циклы ЦП, будет легко видна в Process Explorer (пробел после "=" требуется):

SC Config Servicename Type= own

Сделайте это в окне командной строки или поместите в сценарий BAT. Требуются права администратора и перезагрузка компьютера, прежде чем она вступит в силу.

Исходное состояние можно восстановить:

SC Config Servicename Type= share

Пример: чтобы заставить Windows Management Instrumentation работать в отдельном файле SVCHOST.EXE:

SC Config winmgmt Type= own

Этот метод не имеет вредных последствий, за исключением, возможно, небольшого увеличения потребления памяти. И помимо наблюдения за использованием ЦП для каждой службы, он также упрощает наблюдение за дельтой ошибок страниц, скоростью чтения дискового ввода-вывода и скоростью записи дискового ввода-вывода для каждой службы. Для Process Explorer: меню View / Select Columns: вкладка Process Memory / Page Fault Delta, вкладка Process Performance / IO Delta Write Bytes, вкладка Process Performance / 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, так и в системах без 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, за исключением политический агент, который необходим для правильного взаимодействия агента групповой политики во время загрузки.

Также недавно обнаружил, что был (Активация процесса) и w3svc (IIS World Wide Web) необходимо предоставить общий доступ к своим процессам, поэтому они были добавлены в исключения.

Это было протестировано в Windows 10 (1607, сборка 14393.953), исключения: разные в XP, ....

Пытаться Инструмент раскрытия информации об услугах. Это:

  1. Хранит службы, которые совместно используют процесс svchost.exe.
  2. Настраивает службы для работы в отдельном процессе. После перезагрузки вы увидите каждую службу в отдельном процессе.
  3. Возвращает все службы, сохраненные на шаге 1, обратно в один процесс.

Ваши комментарии и предложения приветствуются.

@ Питер Мортенсен: Спасибо за идею.

Я не знаю, нужен ли вам ответ на этот вопрос, но, устраняя ошибку svchost у клиента, я узнал, что есть командная строка именно для этого: "tasklist / svc" Она дает полный список запущенных процессов, с идентификатором процесса и службами, которые выполняет каждый процесс. Это не дает информации об использовании процессора, но вы можете закрыть их по одному процессу за раз по идентификатору процесса и узнать, по крайней мере, какая группа сервисов забивает ваш процессор.

В настоящее время вы можете использовать PowerShell, чтобы изменить типы служб на «Собственный процесс» и просмотреть объем памяти для каждого из них по отдельности. Этот Gist показать полный код. Основная идея - попытаться изменить тип сервиса с наименее навязчивого на наиболее навязчивый:

$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'