連載
» 2016年05月02日 05時00分 UPDATE

Tech TIPS:svchost.exeプロセスとは何か?(Windows 8.1/10編)

システムの負荷が高い場合によく見かけるsvchost.exeプロセス。これはサービスを起動するための親となるプロセスなので、その中で動作しているいずれかのサービスが高負荷の原因と考えられる。

[打越浩幸,デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象OS:Windows 8/Windows 8.1/Windows 10/Windows Server 2012/Windows Server 2012 R2


解説

svchost.exeプロセスのCPU負荷が高い!?

 Windows OSを使っていると、時々システムが非常に重くなり、タスクマネージャーなどで確認すると、「svchost.exe」というプロセスのCPU負荷が高くなっていることがある。このsvchostとは何か、ウイルスではないのか、そうでないなら何をするものなのか、高いCPU負荷になっても問題ないのか、などが気になるだろう。本TIPSでは、svchostとは何かについて解説する。

タスクマネージャーでシステムの高負荷の原因を探る タスクマネージャーでシステムの高負荷の原因を探る
Windowsシステムの負荷が急に高くなったので、タスクマネージャーで確認すると、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]キーを押すか、タスクバー上で右クリックし、ポップアップメニューから[タスク マネージャー]を選択すると起動できる。

 タスクマネージャーの初期状態では「簡易表示」モードになっているので、画面下にある[詳細]リンクをクリックして、「詳細表示」モードに切り替え、「プロセス」タブか「詳細」タブを選択する。

タスクマネージャーで重いプロセスを確認する タスクマネージャーで重いプロセスを確認する
タスクマネージャーを詳細表示モードに変更すると、システムの負荷が高い原因を特定できる。もし「サービスホスト:〜〜」というプロセスの負荷が高いなら、Windows OSの「サービス」がその原因と考えられる。
  (1)タスクマネージャーが簡易表示になっている場合は、このリンクをクリックして詳細表示に切り替える。
  (2)「プロセス」タブを選択する。
  (3)ここをクリックして、名前順にソートする。
  (4)ここをクリックすると、CPUの負荷の高い順または低い順に表示できる(クリックするたびに切り替わる)。
  (5)サービスホスト:〜〜」はWindows OSのサービスを実行するためのプロセス。通常は複数表示される。
  (6)このサービスによって、CPUの負荷が高くなっている。
  (7)もっと細かくプロセスの状態を見るには、「詳細」タブを選択する。
  (8)サービスに関する情報はこの「サービス」タブでも確認できる。

「svchost.exe」プロセスとは?

 タスクマネージャーの「プロセス」タブで見ると、「サービスホスト: ローカル システム」という項目の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プロセスの中へロードされ、実行が始まる。

タスクマネージャーの「プロセス」タブでサービスの詳細を調査する タスクマネージャーの「プロセス」タブでサービスの詳細を調査する
svchostのプロセスを展開すると、そこに含まれるサービスの一覧を確認できる。
  (1)サービスホスト:〜〜」の左側にある[>]のマークをクリックして展開する。
  (2)このプロセス内で実行中のサービス。このプロセスのCPU負荷が高い場合は、このうちのどれかのサービスが原因と考えられる。
  (3)括弧内は、このsvchost.exe内で実行されているサービスの数を表す。1つしかない場合は表示されない。
  (4)ここからサービスを停止することもできる。ただし停止するとこの一覧から消えるので、再度起動するには「サービス」タブかサービスの管理ツールで開始する必要がある。
  (5)この辺りを右クリックして、ポップアップメニューから[コマンドライン]を選択するとこれが表示される。サービスを起動するためのコマンドとそのパラメーターが表示される。
  (6)サービスはこのようなコマンドラインで起動されている。
  (7)このプロセス(各サービス)が使用しているCPUやメモリ、ディスク、ネットワークトラフィック量。これらの値から、システムに負荷を与えているサービスを判断できる。

 上の画面の「コマンドライン」((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



 実際のレジストリは次のようになっている。

サービスを定義するためのレジストリ サービスを定義するためのレジストリ
各サービスは幾つかのグループに分けられて、起動するように設計されている。
  (1)サービスのグループを定義するレジストリキー。
  (2)SvcHostキーの下にサービスのグループが定義されている。
  (3)サービスのグループ名。グループごとに、独立したsvchost.exeプロセスが割り当てられ、実行される。
  (4)グループに含まれるサービス。
  (5)netsvcグループの例。この中には50個以上のサービスが含まれている(Windows 10の場合)。ただしそれらのサービスが全て同時に実行されるわけではなく、自動起動するかしないかは、サービスごとに個別に設定する(サービスの管理ツールの「スタートアップの種類」で設定できる)。

 この例では、「netsvcs」というグループ(タスクマネージャーでは「サービス ホスト:ローカル システム」と表示されているグループ)には、「CertPropSvc」「SCPolicySvc」「lanmanserver」……という値が含まれている。これらが個別のサービスに相当する。

 サービスの管理ツールで例えば「lanmanserver(Server)」というサービスを起動したり、停止させたりすると、このプロセスの下に表示されている「Server」というサービスの項目が表示されたり、消えたりする。

 「サービス名」と「サービスの表示名」の対応はサービスの管理ツールで確認できる。

サービス管理ツールでサービスの詳細を確認しているところ サービス管理ツールでサービスの詳細を確認しているところ
サービスの名前や説明、スタートアップ種別などは、サービスの管理ツールで確認できる。管理ツールは、タスクマネージャーの「サービス」タブから起動できる。
  (1)サービス管理ツールで表示されているサービス一覧から1つ選んでダブルクリックすると、その詳細を確認できる。
  (2)サービス名。これが先ほどのレジストリに記録されていたサービス名になる。
  (3)サービスの表示名。人が分かりやすいように付けられたサービスの名前。
  (4)サービスの説明。
  (5)サービスを起動するためのコマンドライン。このサービスは「netsvc」グループに属していることが分かる。
  (6)サービスの起動設定。[自動]になっていると、Window OSの起動時に自動的に起動する。
  (7)サービスを手動で開始したり、停止したりするには、これらのボタンをクリックする。

 実際の各サービスは、以下のレジストリで定義されている。

HKLM\SYSTEM\CurrentControlSet\services



「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。