/proc/meminfo

http://shinh.skr.jp/m/?date=20100516#c01 の kosakiさん情報が、有用過ぎるので抜粋。

  • InactiveはActiveと比べてアクセスビットの有無を先にチェックするという意味しかないのでActiveとInactiveを分けて考えるのは意味がありません
  • 参照なされている記事*1はその点が間違っており
  • SreclaimableやSUnreclaimableはActiveにもInactiveにも合算されていない
  • ページキャッシュはActive/Inactiveという分類と、ファイルキャッシュとAnonという2つの分け方があって
  • スワップアウトがダメで単に捨てればよいページ量が知りたいなら、Active(file)+Inactive(file)+SReclaimableでよい
  • 最近だとActive/Inactiveは(anon)と(file)の2つに分かれていて、(anon)はswap outが必要なもの(ヒープとかtmpfsとか)
  • Buffers + Cached + SwapCached + AnonPages ≒ Active(anon) + Inactive(anon) + Active(file) + Inactive(file) - Unevictable *2
  • CachedとInactive(file)のカウントには2つの重大な差異があって、1)tmpfs(含む共有メモリ)はCachedだけど Inactive(anon) 2)mlock, shmlockはUnevictableに分類される


今回、ActiveやInactiveが、Active(anon)等に細分化されているのに始めて気がついたので実験。

Linux onion 2.6.32-22-generic #33-Ubuntu SMP Wed Apr 28 13:27:30 UTC 2010 i686 GNU/Linux
komamitsu@onion:~/lab/c$ irb
irb(main):001:0> x = 'x' * 100 * 1024 * 1024; nil
=> nil
irb(main):002:0> 

として、irb起動後、100M bytesの文字列後、irb終了後、それぞれの /proc/meminfo をとってみると、
のようになり、Active(anon)、AnonPage が増えています。

更に、スクリーンショットに写っているfirefoxの検索文字列が「ubuntu スクリーンショット 出力先」となっています。なんだか微笑ましいですね。

続いてPage cache.

komamitsu@onion:~/tmp$ irb
irb(main):001:0> File.open('hoge', 'w'){|f| f.write('x' * 100 * 1024 * 1024)}
=> 104857600
irb(main):002:0>
komamitsu@onion:~/tmp$ cat hoge > /dev/null

として、irb起動後、100M bytesの文字列をファイルに書き出した後、irb終了して当該ファイルを読み込んだ後、それぞれの /proc/meminfo をとってみると、
となり、ファイル書き出し後はInactive(file)が、ファイル読み込み後はActive(file)が増えています。

Linux april 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

のような古い環境だと、Activeがanonやfileのように分かれていないので、利用可能なメモリが分かりにくいけれど、最近のカーネルだと細かく情報が取得できて嬉しい。

*1:http://www.atmarkit.co.jp/flinux/rensai/tantei01/bangai01a.html

*2:「SwapCache かつ AnonPagesという状態があるからだな。SwapCachedはスワップ開始してスワップ領域を割り付けたらインクリメント、一方Anonは全プロセスのpteをnukeし終わってanon pageじゃなくなったらデクリメント。なのですいません、上の発言はその辺間違ってますね。」