svchost.exe上的细粒度性能报告


20

这一直困扰着我,因此我将询问Server Fault社区。

我喜欢Process Explorer,因为它不仅可以跟踪在任务管理器中获得的高级任务,还可以跟踪更多的任务。但是我一直想知道在svchost下的单个进程中托管的数十个服务中的哪些正在使我的处理器达到峰值。

那么...有没有非侵入性的方式可以找到这些信息?

Answers:


34

是的,有一种(几乎)非侵入性且简单的方法:

将每个服务拆分为在其自己的SVCHOST.EXE进程中运行,并且消耗CPU周期的服务将在Process Explorer中轻松显示(“ =“之后的空格是必需的)):

SC Config Servicename Type= own

在命令行窗口中执行此操作,或将其放入BAT脚本中。需要具有管理特权,并且必须重新启动计算机才能生效。

可以通过以下方式恢复原始状态:

SC Config Servicename Type= share

示例:使Windows Management Instrumentation在单独的SVCHOST.EXE中运行:

SC Config winmgmt Type= own

该技术没有不良影响,只是可能会稍微增加内存消耗。而且,除了观察每个服务的CPU使用率之外,还可以轻松观察每个服务的页面错误增量,磁盘I / O读取速率和磁盘I / O写入速率。对于“进程资源管理器”,分别在菜单“查看/选择列”中:“进程内存/页面错误增量”选项卡,“进程性能/ IO增量写字节数”选项卡,“进程性能/ IO增量读字节”选项卡。


在大多数系统上,只有一个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
Matt Simmons

2
对于推荐PowerShell脚本的发布者:我尝试了一下,它成功地更改了我的所有服务。但是,重启后会弹出一个错误框,并触发重启。我必须使用“最后的良好配置”进行还原。小心。
user42670'5


1
@ChrisS:防止这些文件在更高版本的Windows中被篡改;我想这在Windows XP中很重要...
Tamara Wijsman 2012年

2
@ChrisS感谢您提供到共享列表的链接!该站点现在似乎已死。根据存档,列表为:(HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay全部与关联lsass.exe
cxw

2

虽然我不知道直接执行此操作的简便方法,但是您通常可以从svchost进程的“进程资源管理器”属性页中推断出它。流程属性上的“服务”选项卡将告诉您该流程中托管了哪些服务。“线程”选项卡将向您显示正在运行的线程和线程堆栈以及它们的CPU使用率。通常,线程上的“起始地址”会给出入口点DLL的指示,并通过扩展来指示在该线程上运行的服务。其他时候,您可以查看线程调用堆栈,并在调用堆栈中看到模块名称,该模块名称告诉您正在运行的是哪段代码。


1

尝试使用服务披露工具。它:

  1. 存储共享svchost.exe进程的服务。
  2. 将服务配置为在单独的进程中运行。重新启动后,您将在单独的过程中看到每个服务。
  3. 将步骤1服务中存储的所有内容返回到一个进程。

欢迎您提出意见和建议。

@Peter Mortensen:谢谢你的想法。


1
Dmytro,我在哪里可以学习如何使用您的服务披露工具?我在Windows 7上下载并运行了service_disclosure.exe。简短地讲,我看到一个黑色的命令窗口已打开和关闭,但是似乎什么也没有发生。这真令人不安!我想知道它对我的计算机做了什么以及如何正确使用该工具。
DeveloperDan

嗨,丹。请考虑这一步一步的指导(sourceforge.net/p/svcdisclsr/wiki/Home
德米特罗Ovdiienko

1

警告:在应用此方法之前,请进行必要的研究,还原点和备份过程,并确保此后一切仍然正常。仅通过非RAID系统上的“恢复环境”以及RAID和非RAID系统上的“安全模式”就可以从中进行恢复。已在开发人员机器上而非服务器上进行了测试。

在Powershell中,可以使用以下命令对所有非lass服务执行此操作:

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中运行,policyagent除外,这是组策略代理在引导期间正常通信所必需的。

最近还发现(进程激活)和W3SVC(IIS万维网)需要分享他们的流程,因此他们已被添加到排除。

这已经在Windows 10(1607,构建14393.953)测试后,排除是在XP不同,...


0

我不知道这是否仍是您要回答的问题,但是在对客户的svchost错误进行故障排除时,我了解到有一个命令行正好是这样:“ tasklist / svc”它提供了正在运行的进程的完整列表,带有进程ID和每个进程正在运行的服务。它不会占用处理器,但是您可以通过进程ID一次将其关闭一个进程,并至少了解哪个服务组阻塞了CPU。


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.ps1Enable-Privilege.ps1文件放在同一文件夹中时,可以执行以下脚本:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.