読者です 読者をやめる 読者になる 読者になる

「システム キャッシュ」の謎

人心を惑わし続けるタスクマネージャの話.
『偽偽夜食日記』2005年04月14日(木) より.

タスクマネージャのパフォーマンスタブで表示される情報のひとつに「システム キャッシュ」というものがある。ある人から、先日のメモリ状況のグラフ表示の際にできた利用可能でもコミットチャージでも無い謎空間はこれなのではないかと指摘された。そういえばあのグラフに表示していない値がいくつかある。カーネルメモリ系は単位がひとつ小さいのでグラフに出ないだろうと無視していたのだが、システムキャッシュのサイズは大きいので影響がありそうだ。というかシステムキャッシュだけで物理メモリの半分くらいを消費しているのだが、いくらなんでも大きすぎやしませんか?

(中略)

タスクマネージャは一体何を表示しているのか。「アーキテクチャ徹底解説Microsoft Windows 2000(上)」に、その答えがあった。

システムキャッシュ
システムワーキングセットのサイズ(キャッシュ、ページプール、およびシステムコードを含む)とスタンバイリストのサイズの合計

(中略)

おそらく多くの人がタスクマネージャの表示する「システムキャッシュ」のことを、普通のディスクキャッシュのような、キャッシュ専用にメモリが消費されていると思っているのではないだろうか。そう考えるとものすごい勢いでキャッシュに割り当てているように見えるが、実際はそのサイズの大半がスタンバイリストであり、すなわち空きメモリである。

なんでそんな事をしているのかは謎だが、そんなに気にしているのならば、スタンバイリストのサイズを表示してみたくなるのが自然な流れである。だがパフォーマンスカウンタには該当するものは無い。WMIにも無いようだ。タスクマネージャは一体どうやって取得しているのだろう。

タスクマネージャが表示する「システム キャッシュ」は,実際のところ GetPerformanceInfo API で取得することが出来る値と一致しています.この値が,「システム キャッシュ」という名に反して,「システムワーキングセットのサイズ(キャッシュ、ページプール、およびシステムコードを含む)とスタンバイリストのサイズの合計」であることは,『インサイド Microsoft Windows 第4版 上(asin:4891004738)』でも強調されていました.
また,同書ではカーネルデバッガによって各ページリストごとのサイズを知る方法についても紹介されていました.windbg で !memusage コマンドを実行すると,以下のような結果が得られます.

0: kd> !memusage
 loading PFN database
loading (100% complete)
Compiling memory usage data (99% Complete).
             Zeroed: 173816 (695264 kb)
               Free:      0 (     0 kb)
            Standby:  71317 (285268 kb)
           Modified:   1387 (  5548 kb)
    ModifiedNoWrite:    561 (  2244 kb)
       Active/Valid: 145881 (583524 kb)
         Transition:     16 (    64 kb)
            Unknown:      0 (     0 kb)
              TOTAL: 392978 (1571912 kb)

さてさて,本当の問題は,本当の意味で戯言なのは,パフォーマンスカウンタから取得されるシステムワーキングセット (Memory: Cache Bytes) のサイズと,カーネルデバッガから得られたスタンバイリストのサイズを合計しても,やはり「システム キャッシュ」の値と一致しないことです.かつては一致していた時期があったのかもしれませんが,少なくとも手元の Windows XP SP2 では一致してくれません.
なんか,こう,二重スパイみたいなニクイ奴です.
誰も彼もがタスクマネージャには裏切られています.