这一直困扰着我,所以我会问服务器故障社区。
我喜欢Process Explorer,因为它不仅可以跟踪您在任务管理器中获得的高级任务。但我一直想知道托管在svchost下的单个进程中的十几个服务中的哪一个使我的处理器飙升。
那么......有没有任何非侵入性的方法可以找到这些信息?
这一直困扰着我,所以我会问服务器故障社区。
我喜欢Process Explorer,因为它不仅可以跟踪您在任务管理器中获得的高级任务。但我一直想知道托管在svchost下的单个进程中的十几个服务中的哪一个使我的处理器飙升。
那么......有没有任何非侵入性的方法可以找到这些信息?
是的,有一种(几乎)非侵入性且简单的方法:
拆分每个服务以在其自己的 SVCHOST.EXE 进程中运行,并且消耗 CPU 周期的服务将在 Process Explorer 中轻松可见(“=”后面的空格是必需的):
在命令行窗口中执行此操作或将其放入 BAT 脚本中。需要管理权限,并且需要重新启动计算机才能生效。
可以通过以下方式恢复原始状态:
示例:使 Windows Management Instrumentation 在单独的 SVCHOST.EXE 中运行:
这种技术没有不良影响,除了可能会稍微增加内存消耗。除了观察每个服务的 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 进程。我使用了这个序列(可以直接粘贴到命令行窗口中):
虽然我不知道直接执行此操作的简单方法,但您通常可以从 svchost 进程的 Process Explorer 属性页面推断它。进程属性上的“服务”选项卡将告诉您哪些服务托管在该进程中。线程选项卡将显示正在运行的线程和线程堆栈以及它们的 CPU 使用率。通常,线程上的起始地址将指示入口点 DLL,并通过扩展服务,在该线程上运行。其他时候,您可以查看线程调用堆栈,并在调用堆栈中看到模块名称,告诉您正在运行哪段代码。
尝试服务披露工具。它:
欢迎您提出意见和建议。
@Peter Mortensen:谢谢你的想法。
在 Powershell 中,您可以使用以下命令对所有非 lsass 服务执行此操作:
此处排除的列表都需要在共享的 lsass.exe 中运行,但policyagent 除外,它是组策略代理在启动期间正常通信所必需的。
最近还发现是(进程激活)和w3svc(IIS 万维网)需要共享它们的进程,因此将它们添加到排除项中。
这已经在 Windows 10 (1607, build 14393.953) 上测试过,排除在 XP 中是不同的, ...。
我不知道这是否仍然是您想要回答的问题,但是在对客户的 svchost 错误进行故障排除时,我了解到有一个命令行可以解决这个问题:“tasklist /svc”它提供了正在运行的进程的完整列表,使用进程 ID 和每个进程正在运行的服务。它没有给出处理器使用率,但您可以通过进程 ID 一次关闭一个进程,并至少了解哪组服务正在阻塞您的 CPU。
现在,您可以使用 PowerShell 将服务类型更改为“自己的进程”,并单独查看每个服务的内存。这个 Gist显示了完整的代码。中心思想是尝试将服务类型从侵入性最小的方式更改为侵入性最大的方式:
将
Set-ServiceTypeToOwnProcess.ps1
和Enable-Privilege.ps1
文件放在同一个文件夹中时,您可以像这样执行脚本: