CPU を食べているドライバは誰?

ネットワークファイルコピー中にWindows Server 2008 カーネルが高負荷
https://www.m-tea.info/2009/11/windows-server-2008.html より。

“System” による CPU の消費が激しいなど、タスクマネージャでは特定できない妙な現象に遭った時には KernRate を使ってみましょう。
KernRate は Windows Driver Kit に同梱されています。Windows Driver Kit は Device Driver を書くためのものですが、Driver なんて書かないよ、という方も問題解決の最終手段として是非お使いください。

(当方、問題なく動いている環境ですが…) 実際に問題を特定してみましょう。

まずは WDK をダウンロード、インストールします。

Windows Driver Kit Version 7.0.0
https://www.microsoft.com/downloads/details.aspx?FamilyID=2105564e-1a9a-4bf4-8d74-ec5b52da3d00&displaylang=en

既定では C:\WinDDK\7600.16385.0 に WDK がインストールされます。

その下の tools\other\%PROCESSOR_ARCHITECTURE% に移動すると以下のファイルが用意されていると思います。

tools

それでは Let's 解析!

まず、コマンドプロンプトを管理者権限で起動します。コマンドは単純明快

> kernrate.exe

問題を再現させて数十秒程度待ち、Ctrl+C で終了させます。すると、以下のような出力がなされます。

kernrate

…おお。NTOSKRNL (NT Kernel) がほとんどの時間を消費している!(99.7% が Idle時間なので 0.3% のうちの 98% ですが…)

では、ntoskrnl のどの部分が最も時間を消費しているのか調べて見ましょう。krnlrate.exe に –z moduleName オプションをつけるだけです。

> kernrate.exe –z ntoskrnl

module

このことから、”System” と呼ばれていた謎の 0.3% の CPU 使用率の正体が KeUpdateSystemTime() であることがわかりました。
(単純にタイマー割り込みを処理しているだけです)

おかしな現象にはまったらぜひこのようなツールをご活用ください。

Windows 7 で Core Parking を利用する方法 もよろしくです。