他の人がすでに指摘しているように、そのスクリーンショットから、一生懸命働いている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を実行する方法を示し、カーネルスレッドなどに明示的にアフィニティを設定する必要はないと感じています。