许多超级用户现在可能已经意识到,进程管理器微软使用它在单个进程中托管多个 Windows 服务,每个服务组一个进程。
在 Windows 7(及更高版本?)中,可以右键单击任务管理器中的特定 svchost.exe 进程,然后选择“转到服务”以查看其中“内部”运行的服务。在所有 Windows 版本中,进程探索器也可以使用。
但是,这无法让人们看到,例如,哪个特定服务占用了 100% 的 CPU 或使用了 700 MB 的内存。人们可以手动停止同一组中的服务并使用消除过程,但这很繁琐,尤其是当问题只是间歇性发生时。
微软可能有充分的理由对此类服务进行分组(也许是为了减少每个进程的开销?),但有没有办法强制特定服务在其自己的 svchost.exe 中独立运行?
答案1
不,合适的方式运行这个命令:
sc config
wuauserv 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的。
启动 regedit.exe(注册表编辑器),然后导航至
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
该项包含每个包含组设置的组的子项,以及列出组中服务的每个组的 REG_MULTI_SZ 值。
在子项中查找目标服务的当前组(在此示例中为
netsvcs
),然后创建一个具有合适名称和相同内容的新子项。请记住观察值类型以及内容。创建一个以新组命名的 REG_MULTI_SZ 值,其中包含唯一一行服务名称;并从其现有组 REG_MULTI_SZ 中删除该服务名称。
接下来,导航到下面的目标服务子项
HKLM\SYSTEM\CurrentControlSet\services
。在此示例中:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wuauserv
编辑该
ImagePath
值,并将后面的组名更改-k
为新的组名。重新启动目标服务(例如,使用任务管理器中的“服务”选项卡,或通过 services.msc),它应该出现在它自己单独的 svchost.exe 进程中。
下次 Windows 更新失控运行时,其资源使用情况会立即在任务管理器中可见,甚至可以使用“结束进程”来终止它(但不建议用于更关键的服务)。
如果服务无法启动,请检查上述步骤并重试,或者尝试恢复更改,同时回忆顶部的警告。:-)