SvcHost サービスの分離

Last Update: feedback 共有

本記事はマイクロソフト社員によって公開されております。

こんにちは、Windows サポートチームの栗木です。
本記事では、svchost.exe によるCPU 高負荷およびメモリー使用量増加の調査に必要な前処理であるサービスの分離についてご紹介いたします。

適用対象の OS

  • すべての Windows OS

svchost.exe の 概略

svchost.exe は、DLL ファイルからサービスを読み込むためのシェルとして機能する共有サービス プロセスであり、複数個実行されています。svchost.exe は、リソースの消費を低減するためにデフォルト設定では同じサービス グループに所属する複数のサービスを単一のプロセスで実行しています。ただ、OS が Windows10 1703 以降または Windows Server 2019 では、仕様が変更されており、ほとんどすべてのサービスが単一の svchost.exe で実行されていますが、一部のサービスは、引き続きグループ化されています。

svchost.exe の CPU 高負荷およびメモリー使用量増加の調査

サービスの実行設定がデフォルト設定のままですと単一のサービスのみのリソース使用量を測定できず、原因となるサービスの絞り込みができません。そのため、CPU 高負荷やメモリー使用量増加の原因調査では、まず、svchost.exe 一つに対して、一つのサービスをホストするように、コマンドまたはレジストリの編集による設定変更が必要になります。ただ、問題が発生している svchost.exe が一つのサービスのみホストしている場合は、分離作業は必要ありません。

サービスの分離設定

1. 問題が発生している svchost.exe の PID を確認

タスクマネージャーで問題が発生している svchost.exe の PID を確認します。
ここでは、例として PID 960 で実行されている svchost.exe に問題が発生していると仮定します。

2. PID からサービス グループを特定

タスクマネージャーの [サービス] タブを開き、[グループ] 順にソートし、PID からサービス グループを特定します。
このスクリーンショットでは、サービス グループ「netsvcs または NetSvcs」が同じ PID 960 でホストされていることがわかります。

3. サービスの設定を変更

同じサービス グループに所属しているすべてのサービスの設定を変更します。一部のサービスでは、コマンド実行時に “アクセス拒否が発生する” ことがあります。この場合は、対象サービスのレジストリ情報を直接変更してサービス分離を実施してください。一部、管理者権限でもレジストリ変更作業ができない可能性がございます。その場合は、それらのサービスの分離は必要ありません。

コマンドで設定

管理者として起動したコマンドプロンプトで、sc config <サービス名> type= own を実行します。
例として wuauserv サービスの場合は、以下のコマンドになります。

1
sc config wuauserv type= own
レジストリ エディターで設定

レジストリ エディターより レジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>の Type を 0x10 に変更します。例として wuauserv サービスの場合を示します。

4. 各サービスの再起動またはシステム再起動

分離設定をした各サービスを services.msc などから再起動すると、別々の svchost.exe にて起動します。環境によっては、サービス再起動に失敗する場合がございます。その場合は、サービス分離後にシステム再起動でサービスを起動してください。
サービスの設定を変更した後にサービスの再起動またはシステムを再起動させると、違う PID でサービスがホストされることが確認できます。

サービスの分離設定の解除

分離設定を行ったサービスは、コマンドまたはレジストリの設定で分離設定を解除できます。

コマンドで設定

管理者として起動したコマンドプロンプトで、sc config <サービス名> type= share を実行します。
例として wuauserv サービスの場合は、以下のコマンドになります。

1
sc config wuauserv type= share
レジストリ エディターで設定

レジストリ エディターより レジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>の Type を 0x20 に変更します。例として wuauserv サービスの場合を示します。

サービスを分離したことによる影響

これまで単一の svchost.exe で共有されていたサービスを分離することで共有メモリが別々に使用されることになりますので、多少メモリの消費量が増加します。弊社環境においては、分離する1サービスあたり 数 MB のプライベートメモリ確保となり、メモリ使用量が増加する可能性がございます。

参考 URL

sc config コマンド
Changes to Service Host grouping in Windows 10

変更履歴

  • 2021/02/08 : 本 Blog の公開