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

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

许多超级用户现在可能已经意识到,进程管理器微软使用它在单个进程中托管多个 Windows 服务,每个服务组一个进程。

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

但是,这无法让人们看到,例如,哪个特定服务占用了 100% 的 CPU 或使用了 700 MB 的内存。人们可以手动停止同一组中的服务并使用消除过程,但这很繁琐,尤其是当问题只是间歇性发生时。

微软可能有充分的理由对此类服务进行分组(也许是为了减少每个进程的开销?),但有没有办法强制特定服务在其自己的 svchost.exe 中独立运行?

答案1

不,合适的方式运行这个命令:

sc configwuauserv type= own

这将配置为在自己的进程中运行 Windows 更新。要恢复此设置,请运行

sc config wuauserv type= share

来自具有管理员权限的命令提示符。这将更改设置值type。如果类型为0x20这是一个集体过程,如果值为0x10这是一个独立的过程

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

答案2

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

以下示例隔离了 Windows 更新 ( 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 更新失控运行时,其资源使用情况会立即在任务管理器中可见,甚至可以使用“结束进程”来终止它(但不建议用于更关键的服务)。

如果服务无法启动,请检查上述步骤并重试,或者尝试恢复更改,同时回忆顶部的警告。:-)

相关内容