24個のCPUの1つが100%で固定されているのはなぜですか?


12

ハイパースレッディングを有効にした2つの6コアCPUを使用するHP ProLiant DL380 G7システムで、合計24の論理CPU(Windowsで表示)を使用しています。

アプリケーションを実行すると、システムの合計CPU使用率は良好ですが、24個のCUPのいずれかが100%に固定されます。 ここに画像の説明を入力してください

編集:これは、この期間のシステムプロセスと、使用率の高いプロセッサのPerfMonデータです。 ここに画像の説明を入力してください

これは正常ですか?そうでない場合、どのプロセスがその論理CPUを使用しているかを識別する方法はありますか?Windows PerfMon、ResMon、タスクマネージャー、およびプロセスエクスプローラーは、CPUが100%であることを識別すること以外、助けにはなりませんでした。


29
私の推測では、プロセスがそれを使用しているため、使用されていると思われます。
HopelessN00b 14

1
グラフの上にカーソルを合わせると、そのプロセッサで最もCPUを消費しているプロセスを示すヒントを取得できます。
リーベン・キースメーカーズ14

私は100kの割り込みデルタを疑っています。プロセスエクスプローラーのプロセスリストのスクリーンショットを投稿する必要があります。ここに、システム、DPC、割り込みなどの内容を表示できます。
ゲイブ14

@RyanRies; 「アプリケーション」は、WebSphere MQおよびサードパーティの監視ソフトウェアでもある複数の.Net WCFサービスで構成されています。
パトリックカフ14

2
同じCPUでプロセスをスケジュールするのに比べて、あるCPUから別のCPUにプロセスを移動するのは比較的費用がかかるため、プロセスが実際にCPUを要求している場合、OSはそれを移動しないことを好みます。
マイケル・ハンプトン

回答:


11

他の人がすでに指摘しているように、そのスクリーンショットから、一生懸命働いているCPUがカーネルモードですべての時間を費やしていることがわかります。(赤い色。)

Powershellを管理者として実行し、次を入力します。

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

リストの一番上にあるプロセスは、現在最もカーネルモードのCPU時間を使用しているプロセスです。そのプロセスが「システム」ではない場合、ユーザーモードプロセスがこのCPU使用率を引き起こしていることがわかりました。最高の特権プロセッサ時間を持つプロセスがSystemである場合、それがそうであると思われますが、それはもう少し複雑です。

プロセスエクスプローラーを開きます。必要に応じて、シンボルサーバーをセットアップします。UACの完全な昇格で実行していることを確認してください。システムの「プロセス」を右クリックして、「プロパティ」に移動します。次に、「スレッド」タブに移動します。CPU使用率でスレッドを並べ替えます。このカーネルモードのすべての動作を引き起こしているスレッドはここにあるはずです。開始アドレスの下にリストされているモジュールを見ると、作業が何に関連しているかの手がかりが得られるはずです。たとえば、NDIS.sysの場合、それはネットワークインターフェイスドライバーです。シンボルサーバーをセットアップすると、モジュール内の関数の名前が表示されます(モジュールがMicrosoft以外の場合を除く)。そうでない場合は、モジュールの開始アドレスからの数値オフセットが表示されます。

または、Windows Performance ToolkitのXperfを使用して、割り込み、DPCなどのプロファイルを作成します。

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

で録音を停止します xperf -d logfile.etl

Xperfは古いKernrateツールに代わるもので、非常に詳細なデータを取得できます。

CPUがカーネルモードで作業をしているときは、ほとんどが割り込みサービスルーチンを実行しています。(ISR)割り込みが発生すると、そのプロセッサでユーザーモードの作業が中断され、CPUはその割り込みに登録されたISRを実行します。CPUがこれらの割り込みに過度の時間を費やしている場合、通常は更新が必要な障害のあるデバイスドライバーを示しています。

しかし、このシナリオに関して私にバグがあるのは(しゃれは意図していません)、これを行っているカーネルスレッドがその1つのコアと親和性があるように見えることです。ディスパッチャが、その一見任意のコアで実行するようにスレッドをスケジュールしているように見えるのはなぜかと思います。そのため、このデバイスドライバーを書いた人を見つけて、スレッド化されたDPCを実行する方法を示し、カーネルスレッドなどに明示的にアフィニティを設定する必要はないと感じています。


OSのみハンドルハードウェア割り込みに単一のCPUを使用するためIIRC、それはかなり標準的な動作は...だ
マッシモ

1
@Massimoこれは、古いオペレーティングシステムの場合であったかもしれませんが、それ以上ではありません。すべてのCPUは独自の割り込み記述子テーブルを取得し、すべてのプロセッサは独自のIRQLを持っています。何らかの理由で1つのCPUが高いIRQLでスタックしている場合(つまり、既に割り込みを処理している場合)、同じまたはより低いレベルの割り込みを受信できないため、Windowsは別のプロセッサに割り込みを与えるか、そのまま待機しますCPUが使用可能になるまで。タイマー(以前はCPU0でのみ実行することで悪名が高かったオブジェクト)でさえ、プロセッサ選択アルゴリズムを備えています。
ライアンリース

しかし、ええ、これはレガシーまたは貧弱に記述されたアプリを実行するのと同じくらい簡単で、親和性が不十分で、その後多くのsyscallを作成します。割り込みは通常、呼び出し元と同じCPUで開始および終了する必要がありますが、通常、シングルスレッドのアプリでさえ、実行中にコア間で「負荷分散」されます...これは奇妙なようです親和性。
ライアンリース14

@RyanRies; システムにWindows Performance Toolkitをインストールし、Windows Performance Recorderを使用しました。上記のxperfコマンドはエラーを出し続けました。高CPUは、プロセス-システム; モジュール-ntoskrnl.exe; スレッド-Phase1Initialize; 機能-KeZeroPages。アプリの実行中にのみ発生するため、開発者に引き返すのに十分だと思います(願っています)が、あなたが持っているアイデアにも興味があります。
パトリックカフ14

23

[タスクマネージャ]の[詳細]タブにある[CPU時間]列を表示し、CPU時間のカウントが着実に増加しているプロセスを探します。それがあなたのくさび形のプロセスです。常に約4.17%のCPUを使用しているはずです。


10

それはすべてカーネル時間であるようで、割り込みである可能性があり、それらは単一のCPUによってのみ処理される可能性があります。


+1-確かにカーネル時間のように見えます。
エヴァンアンダーソン14

それは「システム」プロセスの下に表示されますか?テスト実行中に収集したPerfMonデータには、「システム」プロセスのCPUが100%あります。
パトリックカフ14

はい、それがシステムに含まれると思います(それがリストされている場合...)
MichelZ 14

6
これは、ドライバーのバグや、エラー回復なしでドライバーと対話する不良ハードウェアの一部ではないでしょうか?または、タイトループでカーネルを呼び出すソフトウェアかもしれません。
ザンリンクス14

1
@MichelZ、多数のシステムコール(あらゆる種類のI / Oを含む)を作成するユーザープロセスは次のようになります。
-reirab

6

一定のCPU使用率が〜4%(=使用可能なCPUの合計の1/24)であるプロセスを探します。それは、単一のCPUを継続的に占有するものでなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.