Windows 10 中的服务主机分组

服务主机 (svchost.exe) 是一个共享服务进程,充当从 DLL 文件加载服务的 shell。 服务被组织成相关的主机组,每个组在服务主机进程的不同实例内运行。 这样,一个实例中的问题不会影响其他实例。 服务主机组是通过将服务与匹配的安全要求相结合来确定的。 例如:

  • 本地服务
  • 本地服务无网络
  • 本地服务网络受限
  • 本地系统
  • 本地系统网络受限
  • 网络服务

分离 SvcHost 服务

从 Windows 10 创意者更新 (版本 1703) 开始,之前分组的服务将被分隔 - 每个服务都将在其自己的 SvcHost 进程中运行。 对于运行客户端桌面 SKU 且 RAM 超过 3.5 GB 的系统,此更改是自动进行的。 在 RAM 为 3.5 GB 或更少的系统上,我们将继续将服务分组到共享的 SvcHost 进程中。

此设计更改的优点包括:

  • 通过将关键网络服务与主机中另一个非网络服务的故障隔离开来增强可靠性,并在网络组件崩溃时添加无缝还原网络连接的功能。
  • 通过消除与隔离共享主机中的不当行为服务相关的故障排除开销,降低支持成本。
  • 通过提供更多服务间隔离来提高安全性
  • 通过允许按服务设置和特权提高可伸缩性
  • 通过按服务 CPU、I/O 和内存管理改进了资源管理,并增加清晰的诊断数据, (报告每个服务的 CPU、I/O 和网络使用情况) 。

试用此

若要查看重构行为,请创建Windows 10版本 1703 VM 并配置内存设置,如下所示:

  1. 若要查看分组的进程,请将 RAM 设置为 3484 MB 或更小。 重启 VM,然后打开任务管理器。
  2. 若要查看单独的进程,请将 RAM 设置为 3486 MB 或更大。 重启 VM,然后打开任务管理器。

重构还可以更轻松地在任务管理器中查看正在运行的进程。 可以查看任务管理器并确切地知道哪个服务正在使用哪些资源,而无需扩展许多单独的主机组。

例如,下面是版本 1607 Windows 10任务管理器中显示的正在运行的进程:

在任务管理器版本 1607 中运行进程。

将此视图与 Windows 10 版本 1703 中正在运行的进程的相同视图进行比较:

在任务管理器版本 1703 中运行进程。

异常

某些服务将继续在运行具有 3.5 GB 或更高 RAM 的电脑上进行分组。 例如,基本筛选引擎 (BFE) 和 Windows 防火墙 (Mpssvc) 将组合在一个主机组中,RPC 终结点映射程序和远程过程调用服务也将分组在一起。

如果需要确定将继续分组的服务,除了在任务管理器中查看它们并使用命令行工具外,还可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下在其各自的服务密钥中查找 SvcHostSplitDisable 值。

默认值 1 可防止拆分服务。

例如,BFE 的注册表项配置为: 无法分离的服务的示例。

内存占用

分离服务会增加 SvcHost 实例的总数,从而增加内存利用率。 (服务分组可适度减少所涉及的服务的总体资源占用量。)

请考虑以下示例:

分组服务 (< 3.5 GB) 拆分服务 (3.5 GB+)
分组服务的内存利用率。 分离服务的内存利用率

注意

以上表示观察到的峰值值。

服务实例的总数和生成的内存利用率因活动而异。 对于分组服务,实例计数的范围为大约 17-21,对于单独的服务,实例计数的范围通常为 67-74。

试用此

若要确定拆分Windows 10版本 1703 电脑上的托管服务的影响,请在切换内存设置之前和之后运行以下 Windows PowerShell cmdlet:

Get-Process SvcHost | Group-Object -Property ProcessName | Format-Table Name, Count, @{n='Mem (KB)';e={'{0:N0}' -f (($_.Group|Measure-Object WorkingSet -Sum).Sum / 1KB)};a='right'} -AutoSize