有关 svchost.exe 的细粒度性能报告

有关 svchost.exe 的细粒度性能报告

这个问题一直困扰着我,所以我会询问 Server Fault 社区。

我爱进程探索器不仅可以跟踪你在任务管理器。但我经常想知道这十几个服务中哪一个在单个进程中托管在进程管理器使我的处理器飙升。

那么... 有没有什么非侵入性的方法来找到这些信息?

答案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

尝试服务披露工具。 它:

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

欢迎您提出意见和建议。

@Peter Mortensen:谢谢你的想法。

答案4

我不知道这是否仍然是您想要答案的问题,但在解决客户的 svchost 错误时,我了解到有一条命令行可以实现这一点:“tasklist /svc”它提供了正在运行的进程的完整列表,包括进程 ID 和每个进程正在运行的服务。它没有提供处理器使用情况,但您可以按进程 ID 一次关闭一个进程,并至少了解哪组服务正在阻塞您的 CPU。

相关内容