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