/proc/meminfo に載らないけど使用されているLinuxのメモリ
/proc/meminfoに載らない使用されるメモリの管理について
記事: https://www.atmarkit.co.jp/ait/articles/0903/25/news131_2.html
この記事曰く alloc_pages() で呼び出されるとMemFreeはカウントダウンされるが他の部分はカウントアップされないらしい
なぜなのか
alloc_pages() はLinuxでメモリ管理を行うかなり低いレイヤであるBuddyシステムを呼び出す関数
参考リンク集
http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-01-11/
分かりやすくて有用
https://hiboma.hatenadiary.jp/entry/2017/09/28/115932
なぜBuddyシステムを使うかと言うと外部フラグメンテーションが置きにくいアルゴリズムだから
Buddyでは4KB単位ずつしかメモリを確保できない
アプリケーションによっては数Byteだけ使うこともよくある
この乖離を防ぐのがスラブアロケータ(Slab)
https://qiita.com/atsisy/items/05b47056c0c057f05d79#スラブアロケータとは
Slabの他にBuddyを使うものとしてvmalloc() もあるけどここでは扱わない
SlabはBuddyを叩いてkmallocの返り値としてアプリケーションが必要なメモリを返す
この時Buddyからもらったけど使ってないメモリがSlab cacheとなる?
https://qiita.com/bezeklik/items/7e1ac9e5da39261be7bd#slabキャッシュ
dentryやinode情報はここに入る?
Slabを経由してメモリ確保をしているとそのメモリはSlabとして /proc/meminfo に載る
その更に低レベルAPIであるbuddyシステムの関数を叩いていると確かに載らないかも
大本の記事いわくいくつかのアプリケーションではそういうことをやるらしい
余談
/proc/sys/vm/drop_caches で3を入れるとクリアされるのは free slab objects and pagecache
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
allocしたままだった場合ダメ?
sync コマンドがやってるのはDirtyキャッシュの書き出し
Dirtyキャッシュはファイルに書き出す前に一旦書き込む内容をメモリ上に置いておく場所
そのキャッシュをファイルに書き出すことでDirtyキャッシュしていた内容を保存する必要がなくなる
ので、 /proc/sys/vm/drop_caches でキャッシュクリアする前にsyncを打つとFreeなメモリが増えてクリアされやすくなる?
/proc/memoinfo の詳細な内容
https://translate.google.co.jp/translate?sl=en&tl=ja&u=http%3A%2F%2Flinuxperf.com%2F%3Fp%3D142
中国語なのでGoogle翻訳を通している
active / inactive ってなに
あんまり区別せずに足して利用量として計算した方が良いらしい
http://mkosaki.blog46.fc2.com/blog-entry-884.html
https://yohei-a.hatenablog.jp/entry/20141230/1419910742
疑問
allow_pages() だと確かに載らなさそうな気がしてきたけど、MemFreeをカウントダウンしてる処理は何処
読んだ
http://www.ftechworks.mydns.jp/wiki/index.php?BigPicture
メモリ確保の章
https://www.slideshare.net/siburu/page-frame-finalfixedlater
allow_page() の動作が少し書いてある
まだ読めてないけど気になる
セキュリティキャンプ2016でOOM Killerの挙動についての講義資料
http://i-love.sakura.ne.jp/The_OOM_CTF.html#3.2