やりたいこと
/proc/meminfo
の内容を理解するために、色々実験しながら各要素の変遷が見たい。
ただ、メモリ使用状況を可視化するツールはたくさんあるがどれも抽象度が高く、
/proc/meminfoの粒度での変遷を表示するツールを見つけられなかった。
やったこと
/proc/meminfo
をできるだけそのまま表示するmiviewerをつくった。
といっても/proc/meminfo
を取得して積み上げグラフにしただけ。
miviewer
$ ./miviewer.py -h
usage: miviewer.py [-h] [-a] [-i INTERVAL] [-c COUNT] [--check] [-w WINDOW]
[-t {active,buff-cache,available,user-kernel}]
optional arguments:
-h, --help show this help message and exit
-a, --adb Get meminfo via adb.
-i INTERVAL, --interval INTERVAL
The delay between updates in milli-seconds. Default is 200.
-c COUNT, --count COUNT
Number of updates. Default is infinite.
--check Check some formulas.
-w WINDOW, --window WINDOW
Shown period time in seconds. Default is 60.
-t {active,buff-cache,available,user-kernel}, --type {active,buff-cache,available,user-kernel}
Graph type. Default is active.
デフォルトでは、スクリプトを実行したPCの/proc/meminfo
を、200ms間隔で取得し、グラフにプロットする。
--adb
オプションを指定することで、adb
経由でAndroid端末の/proc/meminfo
を取得することも可能。
また、/proc/meminfo
の要素はそれぞれ重なりがあり、一つの積み上げグラフですべての要素を表示することはできないので、
4つの選択肢からグラフタイプを選択できるようにしている。
グラフタイプactive
デフォルト。
Activeかどうか、つまり、LRUリストに乗ってるかどうかで分類された要素を積み上げている。
冒頭のグラフはこのタイプ。
なお、凡例の要素名が@で始まるものは、それそのものが/proc/meminfo
にあるわけではなく、何らかの方法で算出した値であることを示す。
グラフタイプbuff-cache
Buffers
とCached
、つまりバッファキャッシュ(メタデータやraw I/O用のキャッシュ)とページキャッシュ(ファイル自体のページのキャッシュ)の変遷を見るとき用。
グラフタイプavailable
シンプルにMemAvailable
とそれ以外を表示する。
Linux観点でSwappingが始まるまでの余力をザクッと見るとき用。
グラフタイプuser-kernel
ユーザ空間とカーネル空間のどちらで使っているかで分類してプロットする。
なんか使うことがあるかなとおもって用意したものの、デフォルトのactive
があれば必要ない気がしないでもない。
環境
動作確認環境は、以下のとおり。
- Ubuntu 18.04
- Linux 5.0.0-29-generic
- Python 3.6.8
- matplotlib 2.1.1
とはいえあまり環境に依存する実装ではないので、
MemAvailable
がある(3.14以降)Linux環境なら動くんじゃないかと。
もしかしたらadb
モードならMac/Windowsでも動くかもしれない(未確認)。
おわりに
なにかお気づきの点やご要望などありましたらぜひご指摘ください。
参考
-
/proc/meminfo
-
matplotlib.animation
-
matplotlib.stackplot