这是一直困扰着我,所以我会问服务器故障社区。
我喜欢Process Explorer,以便跟踪您在任务pipe理器中获得的高级任务。 但是我经常想知道在svchost下的一个进程中托pipe哪些服务正在使我的处理器飙升。
那么…有没有非侵入性的方式来find这些信息呢?
是的,有一个(几乎)非侵入性和简单的方法:
拆分每个服务以在其自己的SVCHOST.EXE进程中运行,并且耗用CPU周期的服务将在Process Explorer中轻松可见(需要“=”之后的空格):
SC Config Servicename Type= own
在命令行窗口中执行此操作,或将其放入BAT脚本中。 pipe理权限是必需的,需要重新启动计算机才能生效。
原始状态可以通过以下方式恢复:
SC Config Servicename Type= share
例如:使Windows Management Instrumentation在单独的SVCHOST.EXE中运行:
SC Config winmgmt Type= own
这种技术没有不良影响,除了可能稍微增加内存消耗。 除了观察每个服务的CPU使用情况外,还可以轻松观察每个服务的页面错误增量,磁盘I / O读取速率和磁盘I / O写入速率。 对于Process Explorer,菜单View / Select Columns:选项卡Process Memory / Page故障Delta,选项卡Process Performance / IO Delta写入字节,选项卡Process Process性能/ IO Delta读取字节数。
在大多数系统上,只有一个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进程推断它。 stream程属性上的“服务”选项卡将告诉您在该stream程中托pipe哪些服务。 Threads选项卡将显示正在运行的线程和线程堆栈以及CPU使用情况。 线程上的起始地址通常会给出入口点DLL的指示,并且通过对该线程上运行的服务进行扩展。 其他时候,你可以看看线程调用堆栈,并会看到调用堆栈中的模块名称,告诉你哪一段代码正在运行。
尝试服务披露工具 。 它:
欢迎您提出意见和build议。
彼得·莫滕森:谢谢你的想法。
注意:在使用之前,请先进行必要的研究,还原点和备份程序,并检查一切事情是否仍在工作。 只有在非RAID系统上才可以通过恢复环境进行恢复,在RAID和非RAID系统上也可以通过安全模式进行恢复。 这已经在开发人员机器上进行了testing,而不是在服务器上。
在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中运行,但policy policynt除外 ,这是组策略在引导期间正确通信所必需的。
最近还发现(进程激活)和w3svc (IIS万维网)需要共享他们的进程,所以他们被添加到排除。
这已经在Windows 10(1607,版本14393.953)上testing,排除在XP中是不同的,…。
我不知道这是否仍然是你想要的答案,但是在排除客户的svchost错误的同时,我发现有一个命令行:“tasklist / svc”它提供了正在运行的进程的完整列表,与进程ID和每个进程正在运行的服务。 它没有给出处理器的使用情况,但可以通过进程ID一次closures一个进程,并至less了解哪一组服务正在堵塞CPU。