Windows 10でのサービス ホストのグループ化

サービス ホスト (svchost.exe) は、DLL ファイルからサービスを読み込むためのシェルとして機能する共有サービス プロセスです。 サービスは関連するホスト グループに編成され、各グループはサービス ホスト プロセスの異なるインスタンス内で実行されます。 このようにして、あるインスタンスの問題は他のインスタンスには影響しません。 サービス ホスト グループは、サービスと一致するセキュリティ要件を組み合わせることによって決定されます。 次に、例を示します。

  • ローカル サービス
  • ローカル サービスネットワークなし
  • ローカル サービス ネットワーク制限付き
  • ローカル システム
  • ローカル システム ネットワーク制限付き
  • Network Service

SvcHost サービスの分離

Windows 10 Creators Update (バージョン 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 を再起動し、タスク マネージャーを開きます。

リファクタリングを使用すると、タスク マネージャーで実行中のプロセスを簡単に表示できます。 タスク マネージャーを確認し、多数の個別のホスト グループを拡張することなく、どのサービスがどのリソースを使用しているのかを正確に把握できます。

たとえば、Windows 10 バージョン 1607 のタスク マネージャーに表示される実行中のプロセスを次に示します。

タスク マネージャーバージョン 1607 でプロセスを実行しています。

Windows 10 バージョン 1703 で実行中のプロセスの同じビューと比較します。

タスク マネージャーバージョン 1703 でプロセスを実行しています。

例外

一部のサービスは、引き続き 3.5 GB 以上の RAM で実行されている PC でグループ化されます。 たとえば、ベース フィルタリング エンジン (BFE) と Windows ファイアウォール (Mpssvc) は、RPC エンドポイント マッパーサービスとリモート プロシージャ コール サービスと同様に、1 つのホスト グループにグループ化されます。

引き続きグループ化されるサービスを特定する必要がある場合は、タスク マネージャーで表示したり、コマンド ライン ツールを使用したりするだけでなく、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services の各サービス キーで SvcHostSplitDisable 値を探すことができます。

既定値の 1 を指定すると、サービスが分割されなくなります。

たとえば、BFE のレジストリ キーの構成は、 分離できないサービスの例です。

メモリ フットプリント

サービスを分離すると、SvcHost インスタンスの合計数が増え、メモリ使用率が増加します。 (サービス グループ化により、関連するサービスの全体的なリソース 占有領域が少し減少しました)。

次の例を考えてみましょう。

グループ化されたサービス (< 3.5 GB) Split Services (3.5 GB 以上)
グループ化されたサービスのメモリ使用率。 分離されたサービスのメモリ使用率

上記は、ピーク観測値を表します。

サービス インスタンスの合計数と結果のメモリ使用率は、アクティビティによって異なります。 インスタンス数の範囲は、通常、グループ化されたサービスの場合は約 17 から 21、分離されたサービスの場合は 67 から 74 の範囲です。

これを試す

Windows 10 バージョン 1703 PC でのホストされたサービスの分割の影響を判断するには、メモリ設定の切り替えの前後に、次のWindows PowerShell コマンドレットを実行します。

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