在其自己的进程中隔离托管服务(svchost.exe)


13

到目前为止,许多超级用户可能已经知道,Microsoft使用svchost.exe在单个进程中托管多个Windows服务,每个服务组一个进程。

在Windows 7(及更高版本?)中,可以右键单击任务管理器中的特定svchost.exe进程,然后选择“转到服务”以查看在其中“运行”的服务。在所有Windows版本中,也可以使用Process Explorer

但是,这不允许例如查看哪个特定服务将CPU固定为100%或使用700 MB内存。可以手动停止同一组中的服务并使用消除过程,但这很繁琐,尤其是如果问题只是间歇性地发生时。

Microsoft大概有充分的理由对这样的服务进行分组(也许减少了每个进程的开销?),但是有没有办法强制特定服务在其自己的svchost.exe中单独运行?

Answers:


16

不,正确的方法是运行以下命令:

sc configwuauserv type= own

这配置为在其自己的进程中运行Windows Update。要还原此内容,请运行

sc config wuauserv type= share

具有管理员权限命令提示符中。这将更改设置值type。如果type是0x20一个组进程,则值0x10是一个自己的进程

自Windows 10 Creators Update(版本1703,内部版本15063)以来,如果您有足够的RAMWindows会自行执行此操作


1

我知道的唯一方法是通过注册表黑客。通常的注册表数据库编辑免责声明适用(它可能会破坏Windows安装到整个时空结构中的所有内容)。

以下示例隔离了Windows Update(wuauserv)服务,该服务行为不当并使用过多的资源。该方法仅在Windows 7上经过测试。

  1. 启动regedit.exe(注册表编辑器),然后导航到

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
    

    此项包含每个包含组设置的组的子项,以及每个列出该组中服务的组的REG_MULTI_SZ值。

  2. 在子项中查找目标服务的当前组(在此示例中netsvcs:),然后创建一个具有适当名称和相同内容的新子项。记住要观察值的类型和内容。

  3. 创建一个以新组命名的REG_MULTI_SZ值,其中仅包含带有服务名称的一行;并从其现有的组REG_MULTI_SZ中删除服务名称。

  4. 接下来,导航到下方的目标服务子项HKLM\SYSTEM\CurrentControlSet\services。在此示例中:

     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wuauserv
    
  5. 编辑该ImagePath值,然后将组名更改-k为新的组名。

  6. 重新启动目标服务(例如,使用任务管理器中的“服务”选项卡,或通过services.msc),它应出现在它自己的单独svchost.exe进程中。

下次Windows Update运行amok时,它的资源使用情况在任务管理器中立即可见,甚至可以使用“结束进程”将其杀死(尽管不建议用于更关键的服务)。

如果该服务无法启动,请复查上述步骤,然后重试,或者尝试还原所做的更改,同时调出顶部的警告。:-)

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.