Детализированная отчетность по производительности svchost.exe

20

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

Мне нравится Process Explorer за то, что он отслеживает не только задачи высокого уровня, которые вы получаете в диспетчере задач . Но я постоянно хочу знать, какой из этих дюжин сервисов, размещенных в одном процессе под svchost, вызывает всплеск моего процессора.

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

Randolpho
источник

Ответы:

34

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

Разделите каждую службу для запуска в своем собственном процессе 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.
Питер Мортенсен
источник
4
вау, отличное решение +1
Мэтт Симмонс
2
К постеру, который рекомендовал скрипт PowerShell: я попробовал его, и он успешно изменил все мои сервисы. Однако после перезагрузки всплыло окно с ошибкой и был запущен перезапуск. Я должен был восстановить с «последней хорошей конфигурацией». Быть осторожен.
user42670
1
@ChrisS: они защищены от взлома в более поздних версиях Windows; Я думаю, это важно в Windows XP, хотя ...
Тамара Вийсман
2
@ChrisS Спасибо за ссылку на общедоступный список! Этот сайт теперь кажется мертвым. Согласно архиву , список был: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(все связано с lsass.exe)
cxw
2

Хотя я не знаю простого способа сделать это напрямую, вы часто можете найти его на странице свойств Process Explorer для процесса svchost. На вкладке «Службы» в свойствах процесса будет указано, какие службы размещены в этом процессе. А вкладка Threads покажет вам потоки и стеки потоков, а также их загрузку процессора. Часто начальный адрес в потоке будет указывать на DLL точки входа, и, соответственно, на службу, работающую в этом потоке. В других случаях вы можете посмотреть на стек вызовов и увидеть имя модуля в стеке вызовов, которое говорит вам, какой фрагмент кода выполняется.

Кевин Денте
источник
1

Попробуйте инструмент Service Disclosure . Это:

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

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

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

Дмитрий Овдиенко
источник
1
Дмитрий, где я могу узнать, как использовать ваш инструмент Service Disclosure? Я скачал и запустил service_disclosure.exe на Windows 7. Вкратце я увидел, что черное командное окно открывалось и закрывалось, но больше ничего не происходило. Это сбивало с толку! Я хотел бы знать, что он сделал с моим компьютером и как правильно использовать инструмент.
DeveloperDan
Привет Дэн. Пожалуйста, ознакомьтесь с этим пошаговым руководством ( sourceforge.net/p/svcdisclsr/wiki/Home )
Дмитрий Овдиенко
1

Предостережение: Пожалуйста, примите необходимые исследования, точки восстановления и процедуры резервного копирования, прежде чем применять это, а также убедитесь, что все еще работает после этого. Восстановиться после этого можно через Среду восстановления только в системах без 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, ... отличаются .

Тамара Вийсман
источник
0

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

Джим Б
источник
0

В настоящее время вы можете использовать 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'
Росберг Линхарес
источник