Svchost:如何使其每个svchost.exe实例只运行一个模块?如何获取扩展的进程信息?

21

我有一个应用程序出现了问题。我运行应用程序,一切正常。但当我关闭这个应用程序后,系统中的一个"svchost"进程占用了大约95-100%的CPU,我需要找出是什么占用了这么多的CPU周期。

我的解决方法非常简单和直接:

  1. 获取占用大量CPU的"svchost"进程的信息
  2. 我知道"svchost"进程的用途,所以不必要解释。现在我需要知道哪些模块被这个恶意"svchost"加载。
  3. 运行应用程序,关闭它,并确保我的进程完全关闭,不再在内存中。然后,我获取了占用100% CPU的"svchost"的PID。
  4. 我运行了ProcessExplorer(来自sysinternals),获取了有多少和哪些服务由此"svchost"托管。它们大约有12个服务。我不会去烦恼这个列表,因为我更关心的是如何识别这12个服务中哪一个占用了CPU周期。
  5. 现在我已经有了这个列表,这里开始棘手的部分......我想执行以下两种选项之一:

选项1: 如何确定这12个服务中的哪一个占用了这么多CPU? 我可以获取托管在此进程中每个服务的详细信息,而不是现在我所拥有的进程基础上的信息吗?

选项2: 是否有可能配置Windows使得每个svchost实例只运行一个服务?

如果有更好的方法来调查、缩小这个问题的根本原因,请告诉我。


1
我找到了如何在我的问题中执行两个选项的解决方案:选项1的解决方案:打开性能监视器(perfmon.exe),转到_CPU_选项卡,在_Image_选项卡下检查svchost.exe(要观察的PID),转到“服务”框并检查不同服务的CPU使用情况。选项2的解决方案:转到注册表键:HKLM\System\CurrentControlSet\Services|<ServiceName>(DLL),将类型更改为0x10。有关更多信息,请参见http://blogs.technet.com/b/askperf/archive/2008/01/11/getting-started-with-svchost-exe-troubleshooting.aspx。 - aeon
2个回答

27

我已回答了我的问题,但将其放在评论中。现在我将相同的内容添加为答案,以便知道。

我找到了如何完成上面问题中的两个选项:

选项1的解决方案:

打开资源监视器(resmon.exe),转到CPU选项卡,在图像选项卡下检查svchost.exe(要观察的PID),“服务”框,检查不同服务的CPU使用情况。

选项2的解决方案:

sc config <service name> type= own

或者在注册表中更改HKLM\System\CurrentControlSet\Services\\Type的值为0x10。

有关更多信息,请参阅http://blogs.technet.com/b/askperf/archive/2008/01/11/getting-started-with-svchost-exe-troubleshooting.aspx


4
非常有帮助,谢谢。根据TechNet博客文章所述,要将其更改回共享进程,请运行“sc config <service name> type= share”。 - Mark Berry
@MarkBerry:如果它有所帮助,我很高兴 :) - aeon
在选项1的解决方案中,“打开性能监视器(perfmon.exe),转到CPU选项卡”似乎有错别字。我相信你实际上是想说“打开资源监视器(resmon.exe)”。在Windows 7中,性能监视器中没有CPU选项卡。 - RBT
或者您可以在运行提示符上键入“perfmon /res”来打开资源监视器。 - RBT

6
  1. 启动资源监视器

    • 在开始菜单中输入“资源监视器” 或者
    • 在任务管理器的性能选项卡下点击“资源监视器”按钮
  2. 在资源监视器顶部点击CPU选项卡

  3. 勾选您想要调查的进程(我会按平均CPU排序)

  4. 服务将根据您标记的进程进行过滤,并显示该进程中运行的每个服务的CPU统计信息。


3
在非英语的Windows系统中:使用_W+r_,输入perfmon /res - Jarekczek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接