システムの負荷が高い場合によく見かけるsvchost.exeプロセス。これはサービスを起動するための親となるプロセスなので、その中で動作しているいずれかのサービスが高負荷の原因と考えられる。
対象OS:Windows 8/Windows 8.1/Windows 10/Windows Server 2012/Windows Server 2012 R2
Windows OSを使っていると、時々システムが非常に重くなり、タスクマネージャーなどで確認すると、「svchost.exe」というプロセスのCPU負荷が高くなっていることがある。このsvchostとは何か、ウイルスではないのか、そうでないなら何をするものなのか、高いCPU負荷になっても問題ないのか、などが気になるだろう。本TIPSでは、svchostとは何かについて解説する。
なお対象となるOSはWindows 8.0/Windows Server 2012以降とする。Windows 7やWindows Server 2008 R2以前のWindows OSのsvchostについは、以下の記事を参照していただきたい。これらのWindows OSではタスクマネージャーの機能や外観などが異なるため、少し操作/確認方法が異なっている。
svchostの解説の前に、どのプロセスが重いのかを調べる方法を紹介しておく。
WindowsシステムのCPU負荷が高い場合、どのプロセスが重くなっているか、何が原因かを調べるには、「タスクマネージャー」を利用するのが一般的である。タスクマネージャーは[Ctrl]+[Shift]+[Esc]キーを押すか、タスクバー上で右クリックし、ポップアップメニューから[タスク マネージャー]を選択すると起動できる。
タスクマネージャーの初期状態では「簡易表示」モードになっているので、画面下にある[詳細]リンクをクリックして、「詳細表示」モードに切り替え、「プロセス」タブか「詳細」タブを選択する。
タスクマネージャーの「プロセス」タブで見ると、「サービスホスト: ローカル システム」という項目のCPU使用率が高くなっていることがある(上の画面の(6)。Windows Updateの実行中に高くなることが多い)。これは実際には「svchost.exe」というプロセスのCPU使用率を表している。
svchost.exeとは、Windows OSの「サービス」を実行するためのプロセスのことである。これはウイルスではないし(右クリックして[ファイルの場所を開く]でフルパスが「%windir%\System32\svchost*.exe」であることを確認しておくこと)、複数のsvchost.exeが存在するのも正常な動作である。状況によってはこのプロセスのCPU使用率が高くなるのは、Windows OSではよくあることである。
Windows OS内では多数のサービスが実行されており、その一覧はタスクマネージャーの「サービス」タブ(上の画面の(8))や、管理ツールにある「サービス管理ツール」(サービス管理ツールは、「サービス」タブ画面からも起動できる)、もしくは「tasklist /svc | find /v "N/A"」コマンドなどで確認できる。
サービスの実体となるプロセスはいくつかあるが、svchost.exeは汎用のサービスホストとして、多くのサービスで利用されているプロセスである。例えばlsass.exeやSearchIndexer.exeといったサービスプロセスは通常1つしか実行されていないが、svchost.exeは複数起動している。svchost.exeが親プロセスとなって、OS内の各種サービスをホストし、実行する。
Windows OSでは通常、数十〜数百のサービスが定義されている。OS起動時にはそのうち100個程度のサービスが自動起動し、それ以外のサービスは必要に応じて自動的に起動や停止、終了するようになっている(サービスの数はOSのバージョンやインストールしているアプリケーションなどによって変動する)。
ただしサービス1つにつき、svchost.exeが1つずつ存在するのではなく、1つ、もしくは複数のサービスをまとめてグループ化し、そのグループごとに1つのsvchost.exeが割り当てられている。
タスクマネージャーの「プロセス」タブを見ると、「サービスホスト:〜〜」というプロセスが複数動作しているが、これがサービスをホストしているsvchost.exeプロセスである。それぞれのプロセスの中には1つ、もしくは複数のサービスが存在している。各プロセス内でどのサービスが動作しているかは、タスクマネージャーの「プロセス」タブ画面で左側にある[>]のマークをクリックすると展開され、分かるようになっている。
なお、停止中のサービスはここには現れない。サービスを起動すると、適切なsvchost.exeプロセスの中へロードされ、実行が始まる。
上の画面の「コマンドライン」((5))のところに記述されているのが、サービスを起動するためのsvchost.exeプロセスの実行パスとパラメーターである。例えば上の画面には「サービス ホスト:ローカル サービス」というプロセスがあり(コマンドラインは「svchost.exe -k LocalService」)、その中では8つのサービス((2))が実行されている。右側に表示されているCPU使用率の値は、このsvchost.exeプロセスのCPU使用率であり、各サービスがそれぞれ何%使用しているかは分からない。
もしCPU使用率の高いsvchost.exeプロセスがあるなら、その中で実行されているサービスのどれかがCPU負荷を高くしていると判断できる。ただしどのサービスが原因かは分からないので、その場合は1つずつサービスを停止してみるなどすれば、判断できるかもしれない(ユーザーが勝手に停止してもよいサービスはあまり多くないが)。
どのサービスがどのsvchost.exeの中で動作するかは、サービスの設計者が決めることである。一般的には、同じ用途のサービスや、同じ権限で動作するサービス、同時に利用されるサービスなどが同じグループにまとめられている。サービスのグループ名と、そこに含まれるサービスの一覧は、以下のレジストリで定義されている。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
実際のレジストリは次のようになっている。
この例では、「netsvcs」というグループ(タスクマネージャーでは「サービス ホスト:ローカル システム」と表示されているグループ)には、「CertPropSvc」「SCPolicySvc」「lanmanserver」……という値が含まれている。これらが個別のサービスに相当する。
サービスの管理ツールで例えば「lanmanserver(Server)」というサービスを起動したり、停止させたりすると、このプロセスの下に表示されている「Server」というサービスの項目が表示されたり、消えたりする。
「サービス名」と「サービスの表示名」の対応はサービスの管理ツールで確認できる。
実際の各サービスは、以下のレジストリで定義されている。
HKLM\SYSTEM\CurrentControlSet\services
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.