如何通过svchost.exe诊断CPU异常使用情况?[重复]


19

我有一台带有双核奔腾处理器的Win 7 32位系统的笔记本电脑(这是2010年的笔记本电脑)。有时它可以正常工作,但通常在100%CPU负载下处于空闲状态。两个svchost.exe进程(每个50%)占用CPU。据我了解,这是一个服务主机。有什么办法找出罪魁祸首是哪种服务?

注意:即使在安全模式下,也会发生这种情况。


1
您可以使用进程管理器来看看服务是SVCHOST的两个实例下运行(technet.microsoft.com/en-us/sysinternals/processexplorer.aspx
Yorik

@Yorik:我想到了这一点,但是ProcessExplorer没有显示任何用处。
紫罗兰色长颈鹿

5
在Windows 7中,我要说的是,当前超过90%的svchost CPU问题与Windows Update服务有关。如果您在更新系统方面确实遇到了麻烦(在使用旧处理器的全新安装中可能很难),请尝试在没有网络连接的情况下安装KB3050265,KB3138612和KB3145739。然后重新启动并搜索更新。
赛道

@ontrack:有趣。实际上,我认为这台计算机上的更新检查已禁用,自2010年或2012年以来可能从未进行过更新。而且我也不想安装更新,我只需要解决CPU问题。如果您是正确的话,是否将仅禁用Windows Update服务帮助?
紫罗兰色长颈鹿

这被问了很多遍了。见dup。您可能会看到WU打扫问题。从我回答的步骤中解决它:superuser.com/a/996072/174557
magicandre1981

Answers:


28

由于svchost.exe的一个实例承载多个系统服务,因此以下是如何将这些服务分离到各自的svchost.exe实例,以找出哪个服务占用了CPU。

程序如下:

  1. 使用任务管理器显示按CPU降序排列的所有进程,并标记消耗CPU的进程的PID

  2. 在命令提示符(cmd)中输入命令
    Tasklist /svc /fi "IMAGENAME eq svchost.exe"
    在此处输入图片说明

  3. svchost.exe的有问题实例现在可以通过其PID找到,在右侧您将找到它们所托管的系统服务的列表

  4. 对于列表中的每个名称,在以管理员身份运行的命令提示符(cmd)中输入以下命令:(
    sc config <name> type= own
    请注意,“ =”和“ own”之间的空格)

  5. 重启

现在,您分离的系统服务将分别在其自己的svchost.exe实例中运行,并且可以在“任务管理器”的“进程”选项卡中看到。您可以右键单击实例,然后选择“转到服务”以直接转到该服务,或者再次使用tasklist命令。

有关更多信息,请参见Microsoft文章
SVCHOST.EXE入门疑难解答


7

Process Explorer使这变得容易。我已经确认可以在64位Windows 7 Professional和64位Windows 10 Pro上使用Process Explorer v16.20。

  1. 运行Process Explorer提升权限。
  2. 在列中找到一个值svchost.exe较高(甚至只是可测量/非空白)的过程CPU。按ProcessCPU列排序可能有助于此目的。
  3. 右键单击该svchost.exe进程,然后选择Properties...
  4. 在过程属性窗口中,选择Threads选项卡。将显示此过程中的所有线程。
  5. 在该CPU列中找到一个具有高(或再次是仅可测量/非空白)值的线程。按CPU列排序可能有助于此目的。Process Explorer的“进程线程”选项卡
  6. Service列将显示该线程在其中运行的服务的名称。

如果您不熟悉服务名称...

  1. 在过程属性窗口中,选择Services选项卡。将显示在此过程中运行的所有服务。
  2. ServiceServices选项卡上的Service列与Threads您在步骤6中找到的选项卡上的列值匹配。流程浏览器的流程服务选项卡
  3. Display Name列将显示服务的友好名称。所选服务的描述将出现在服务列表下方。

啊,我不知道Process Explorer的那些高级功能。谢谢。
紫罗兰色长颈鹿

3

您可以使用任务管理器。还有其他方法(命令行,甚至使用WinAPI编写一些程序),但是在这里我将不讨论它们。在继续操作之前,您的用户应具有管理权限。

在“ 进程”选项卡上:

  • 选中显示所有用户的进程
  • 右键单击进程“表头”(其中包含列名,如“ 图像名称”,“ PID”,“ 用户名”,“ CPU ” ...),然后选择“ 选择列...”
    • 在弹出的对话框中,向下滚动并确保选中“ 命令行 ”和“ PID(进程标识符)”,然后按“ 确定”
  • 返回“ 进程”选项卡,单击“ CPU”列标题,以便按其CPU消耗对进程进行排序(请注意,进程可能以升/降序显示-每次单击CPU都会切换顺序),单击直到2个进程出现在表格顶部。现在您可以看到他们的命令行了(我不知道,但是我感觉其中之一是netsvcs(网络服务))以及他们的PID。

  • 接下来,您需要将2个流程与服务进行匹配。为此,您可以:

    • 他们右键单击,然后转到服务(S)...。这将移至“ 服务”选项卡,选择在该进程中运行的所有服务(对于此选项,您不需要任何前面的步骤:))。
    • mmc中打开“ 服务”管理单元。当对服务进行两次单击时(仅检查正在运行的服务才有意义),在“ 可执行文件的路径”下,您可以看到应该对其进行匹配的命令行。
  • W10上,您可以从资源监视器查看所需的确切信息(可以从“ 任务管理器 ”的“ 性能”选项卡启动它)。您可以在此处转到“ CPU”选项卡,并列出服务及其CPU消耗。

EDIT0:更新了答案,以提供一种更简单(并使方式更有意义)的方法,而不是使用我最初发布的左手样式刮擦我的右头部


我从未注意到您可以看到命令行,整洁!不像哈里·麦克的回答那么简单,但是很高兴知道。
紫罗兰色长颈鹿

任务管理器可以自行执行此操作。如果切换到“服务”选项卡时选择了svchost进程,则将在该进程中选择该进程中运行的服务。
西蒙·里希特

1
真?在W10上不会发生这种情况(至少当已经选择了某些服务时)。唯一的方法是在进程上单击r,然后选择Go to service(s)(我错过的选项-很可能它也存在于W7中)。不幸的是我无法检查。
CristiFati

1
@CristiFati此选项自Windows Vista开始就存在(来源:technet.microsoft.com/en-us/library/ff642468.aspx),您应该将其添加到答案中,而不要手工进行PID匹配
Vasily Alexeev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.