答案1
是的,有一种(几乎)非侵入性且简单的方法:
将每个服务拆分为在其自己的 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 写入率。对于 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.
答案2
虽然我不知道直接执行此操作的简单方法,但您通常可以从 svchost 进程的 Process Explorer 属性页中推断出来。进程属性上的“服务”选项卡将告诉您该进程中托管了哪些服务。而“线程”选项卡将显示正在运行的线程和线程堆栈以及它们的 CPU 使用率。通常,线程上的起始地址将指示入口点 DLL,以及在该线程上运行的服务。其他时候,您可以查看线程调用堆栈,并在调用堆栈中看到模块名称,该模块名称会告诉您正在运行哪段代码。
答案3
尝试服务披露工具。 它:
- 存储共享 svchost.exe 进程的服务。
- 配置服务在单独的进程中运行。重启后,您将看到每个服务都在单独的进程中运行。
- 将步骤 #1 中存储的所有服务返回到一个进程。
欢迎您提出意见和建议。
@Peter Mortensen:谢谢你的想法。
答案4
我不知道这是否仍然是您想要答案的问题,但在解决客户的 svchost 错误时,我了解到有一条命令行可以实现这一点:“tasklist /svc”它提供了正在运行的进程的完整列表,包括进程 ID 和每个进程正在运行的服务。它没有提供处理器使用情况,但您可以按进程 ID 一次关闭一个进程,并至少了解哪组服务正在阻塞您的 CPU。