top のメモリ欄の見方
FreeBSD 5.3, 5.5 では top の Mem: 行の値を全て足すと物理メモリ量より多くなる。
例1
Mem: 146M Active, 21M Inact, 35M Wired, 8360K Cache, 34M Buf, 31M Free irb(main):003:0> 146+21+35+8+34+31 => 275
例2
Mem: 80M Active, 39M Inact, 54M Wired, 16M Cache, 34M Buf, 53M Free irb(main):005:0> 80+39+54+16+34+53 => 276
このマシンの物理メモリ量は 256MB で、dmesg によると
real memory = 267845632 (255 MB) avail memory = 252428288 (240 MB)
man によると各項目の意味は
Active: アクティブなページ数。
Inact: アクティブでないページ数。
Wired: 固定されているページ数。キャッシュされたファイルデータページを含む。
Cache: VM レベルのディスクキャッシュに使用しているページ数。
Buf: BIO レベルのディスクキャッシュに使用しているページ数。
Free: 未使用ページ数。
「Absolute BSD」によれば
Active 実行中のユーザプロセスとそのデータが使用中メモリ。
Inact プログラムが終了すると、そのプログラムの情報はここに移る。
Wired カーネル内部のデータ構造体など。絶対にスワップアウトしない。
Buf メモリバッファ。最近読み込まれたデータが格納される。
Cache がバッファキャッシュだろう。Buf と Inact がよくわからない。プログラムの情報というと、テキストセグメントのことかな?
top のソースを見ると、情報取得元は次の通り。
GETSYSCTL("vfs.bufspace", bufspace); // Buf GETSYSCTL("vm.stats.vm.v_active_count", memory_stats[0]); // Act GETSYSCTL("vm.stats.vm.v_inactive_count", memory_stats[1]); // Inact GETSYSCTL("vm.stats.vm.v_wire_count", memory_stats[2]); // Wired GETSYSCTL("vm.stats.vm.v_cache_count", memory_stats[3]); // Cache GETSYSCTL("vm.stats.vm.v_free_count", memory_stats[5]); // Free
GETSYSCTL は中で sysctlbyname(3) を呼んでいる。
「vfs.bufspace」でぐぐってみると、この辺が見つかった。
http://lists.freebsd.org/pipermail/freebsd-amd64/2005-May/004967.html
http://lists.freebsd.org/pipermail/freebsd-amd64/2005-May/004960.html
Buf は sysctl で表示される vfs.bufspace と同じ。バッファキャッシュ用に割り当てられている仮想メモリ量。vfs.hibufspace がその最大値。しかしこれらの値は uninteresting。バッファ用の仮想メモリはほとんど決して解放されないから、bufspace は常に最大値に近い。最大値は BKVASIZE(コンパイル時定数) * nbuf(起動時定数)で決まる。
FreeBSD はしばらく前に仮想メモリとバッファシステムを統合した。top などの統計ツールの方がそれに追い付いていない。メモリのうちどれだけバッファキャッシュに使われているかをユーザランドから正確に知る方法は無い。
と言っているような。
Buf は物理メモリに入っていないページも数えているし、Buf と Cache で共通する部分があるということ???
Buf の値を観察してみると、システム起動直後こそ小さいものの、X や firefox を立ち上げてからはずっと 34M のまま。
仮想メモリとバッファキャッシュの統合についてはこんなところにも:
仮想メモリとファイルシステムバッファキャッシュの統合 により、プログラムに使われるメモリとディスクキャッシュの量は、常に最適に調整されるようになっています。
http://www.freebsd.org/ja/features.html
「BSDカーネルの設計と実装 6.6.2 バッファ管理」にも書いてある。
「BSDカーネルの設計と実装 5.12 ページの置換」によると、メモリは
Wired, Active, Inactive, Cache, Free
の5つに分割して管理される。
左にいくほどカーネルにとって必要度が高い。右の方から使われていく。
[追記:2007-04-30]
man systat によると、systat -vmstat の「buf」の項目がバッファキャッシュに使われているメモリ量とのこと。wire, act, inact, cache, free は top と同じものを表示しているよう。
top 公式サイト
http://www.unixtop.org/
http://sourceforge.net/projects/unixtop
top は William LeFebvre によって書かれ、4.1 BSD で登場した。
関連
topコマンドのみ方を教えてください
http://q.hatena.ne.jp/1110336349
free の出力の見方
http://search.luky.org/linux-users.6/msg06604.html
top コマンドの見方 メモリ編
http://paranoid.dip.jp/kaworu/2007-05-14-3.html
Fedora Core Linux の場合
Fedora の top の出力はもっとシンプル。
Mem: 255688k total, 208804k used, 46884k free, 72860k buffers
255688 = 208804 + 46884
その内 72860 がバッファキャッシュに使われているということだろう。