web-dev-qa-db-ja.com

svchost.exeによる異常なCPU使用率を診断する方法

デュアルコアPentiumを搭載したWin 7 32ビットシステムを搭載したラップトップを持っています(2010ラップトップです)。正常に動作することもありますが、通常は100%のCPU負荷でアイドル状態になります。 CPUは、2つのsvchost.exeプロセス(それぞれ50%)によって消費されます。私が理解している限り、これはサービスホストです。原因となっているサービスを特定する方法はありますか?

注意:これはセーフモードでも発生します。

19
Violet Giraffe

Svchost.exeのインスタンスが複数のシステムサービスをホストしているため、ここでは、それぞれのサービスをsvchost.exeの独自のインスタンスに分離して、どのサービスがCPUを消費しているかを調べます。

手順は次のとおりです。

  1. タスクマネージャーを使用して、CPUの降順で並べ替えられたすべてのプロセスを表示し、CPUを消費するプロセスのPIDをマークします。

  2. コマンドプロンプト(cmd)にコマンドを入力します
    Tasklist /svc /fi "IMAGENAME eq svchost.exe"
    enter image description here

  3. Svchost.exeの問題のあるインスタンスをPIDで見つけることができるようになり、右側に、それらがホストするシステムサービスのリストが表示されます。

  4. リスト内の名前ごとに、「管理者として実行」であるコマンドプロンプト(cmd)に次のコマンドを入力します。
    sc config <name> type= own
    (「=」と「所有」の間のスペースに注意してください)

  5. リブート

分離したシステムサービスはそれぞれ、svchost.exeの独自のインスタンスで実行され、タスクマネージャーの[プロセス]タブに表示されます。インスタンスを右クリックして[サービスに移動]を選択し、サービスに直接移動するか、tasklistコマンドを再度使用できます。

詳細については、Microsoftの記事を参照してください。
SVCHOST.EXEトラブルシューティング入門

28
harrymc

Process Explorer はこれを簡単にします。 64ビットWindows 7 Professionalおよび64ビットWindows 10 Pro上のProcess Explorer v16.20でこれが動作することを確認しました。

  1. 管理者特権でProcess Explorerを実行します。
  2. CPU列に高い(または単に測定可能/空白ではない)値を持つsvchost.exeプロセスを見つけます。 Process列またはCPU列で並べ替えると、これに役立つ場合があります。
  3. svchost.exeプロセスを右クリックし、Properties...を選択します。
  4. プロセスのプロパティウィンドウで、[Threads]タブを選択します。このプロセスのすべてのスレッドが表示されます。
  5. CPU列で、高い(または、測定可能/非ブランクの)値を持つスレッドを見つけます。 CPU列で並べ替えると、これに役立ちます。 Process Explorer process Threads tab
  6. Service列には、そのスレッドが実行されているサービスの名前が表示されます。

サービス名がよくわからない場合...

  1. プロセスのプロパティウィンドウで、[Services]タブを選択します。このプロセスで実行されるすべてのサービスが表示されます。
  2. ServiceタブのServices列を、手順6で見つけたServiceタブのThreads列の値と一致させます Process Explorer process Services tab
  3. Display Name列には、サービスのわかりやすい名前が表示されます。選択したサービスの説明がサービスのリストの下に表示されます。
7
BACON

タスクマネージャを使用できます。他の方法(コマンドライン、またはWinAPIを使用してプログラムを作成する方法)もありますが、ここでは説明しません。先に進む前に、ユーザーには管理者権限が必要です。

Processesタブ:

  • チェックすべてのユーザーからのプロセスを表示
  • プロセス「テーブルヘッダー」を右クリックします(これにはImage name[〜#〜] pid [〜#〜]ser Name[〜#〜] cpu [〜#〜]、...)、および選択列の選択...
    • ポップアップするダイアログで、下にスクロールして、必ずコマンドラインPID(プロセスID)を確認し、次に[〜#〜] okを押します。 [〜#〜]
  • Processesタブに戻り、[〜#〜] cpu [〜#〜]列ヘッダーをクリックして、プロセスがCPU消費量順に並べられるようにします(プロセスは昇順/降順で表示される場合があります。クリックするたびに[〜#〜] cpu [〜#〜]順序が切り替わります)、テーブルの上部に2つのプロセスが表示されるまでクリックします。これで、あなたはそれらのコマンドライン(私にはわかりませんが、それらの1つがnetsvcs(ネットワークサービス)であると感じています)とそれらのPIDを見ることができます。

  • 次に、2つのプロセスをサービスに一致させる必要があります。そのためには、次のいずれかを実行できます。

    • それらを右クリックしてからGo to service(s)...をクリックします。これはServicesタブに移動し、そのプロセスで実行されているすべてのサービスが選択されます(このオプションの場合、前の手順は必要ありません:))。
    • mmcServicesスナップインを開きます。サービスを2回クリックすると(実行中のサービスをチェックするだけで意味があります)、実行可能ファイルへのパスの下で、一致させる必要のあるコマンドラインを確認できます。
  • W1では、必要な正確な情報をResource Monitorから表示できます(Task ManagerPerformanceから開始できます) =タブ)。そこで[〜#〜] cpu [〜#〜]タブに移動すると、サービスとそのCPU消費がリストされます。

EDIT:最初に投稿した左手で右頭を引っかくスタイル1ではなく、よりシンプルな(そしてより理にかなった)アプローチを提供するために回答を更新しました。

3
CristiFati