ハイパースレッディングを有効にした2つの6コアCPUを使用するHP ProLiant DL380 G7システムで、合計24の論理CPU(Windowsで表示)を使用しています。
アプリケーションを実行すると、システムの合計CPU使用率は良好ですが、24のCUPの1つが100%で固定されています。
編集:これは、この期間のシステムプロセスと、使用率が高いプロセッサのPerfMonデータです。
これは正常ですか?そうでない場合、その論理CPUを使用しているプロセスを特定する方法はありますか? Windows PerfMon、ResMon、タスクマネージャー、およびプロセスエクスプローラーは、CPUが100%であることを確認する以外は役に立ちませんでした。
他の人がすでに指摘したように、そのスクリーンショットから、非常によく働いているCPUがカーネルモードですべての時間を費やしていることがわかります。 (赤い色。)
管理者としてPowershellを実行し、次のように入力します。
Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending
リストの一番上にあるプロセスは、現在カーネルモードのCPU時間を最も多く使用しているプロセスです。そのプロセスがnot "System"である場合、このCPU使用率を引き起こしているユーザーモードプロセスがわかりました。 Privileged Processor Timeが最も高いプロセスがSystemである場合、私はそうだと思いますが、それはもう少し複雑です。
プロセスエクスプローラーを開きます。必要に応じて、シンボルサーバーを設定します。完全なUAC昇格で実行していることを確認してください。システムの「プロセス」を右クリックし、[プロパティ]に移動します。次に、「スレッド」タブに移動します。 CPU使用率でスレッドを並べ替えます。このすべてのカーネルモードの動作を引き起こしているスレッドがここにあるはずです。 Start Addressの下にリストされているモジュールを見ると、作業が何に関連しているかについての手掛かりが得られるはずです。たとえば、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つのコアに対してaffinitizedのように見えるように見えます。なぜディスパッチャーがスレッドをその任意のコア上で実行するようにスケジュールするだけのように見えるのでしょうかそのため、このデバイスドライバーを書いた人を見つけて、スレッド化されたDPCを実行する方法を示す必要があり、カーネルスレッドなどに明示的にアフィニティを設定する必要がないと感じています。
「タスクマネージャ」の「詳細」タブにある「CPU時間」列を表示し、CPU時間カウントが着実に増加しているプロセスを探します。それはあなたのくさびのプロセスです。常に4.17%程度のCPUを使用しているはずです。
それはすべてのカーネル時間のようであり、割り込みである可能性があります。それらは単一のCPUによってのみ処理される可能性があります。
〜4%(=利用可能な合計CPUの1/24)の一定のCPU使用率を持つプロセスを探します。これは、単一のCPUを継続的に使用するものでなければなりません。