search
LoginSignup
5
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

/proc/meminfoのviewerをつくった

やりたいこと

/proc/meminfoの内容を理解するために、色々実験しながら各要素の変遷が見たい。
ただ、メモリ使用状況を可視化するツールはたくさんあるがどれも抽象度が高く、
/proc/meminfoの粒度での変遷を表示するツールを見つけられなかった。

やったこと

/proc/meminfoをできるだけそのまま表示するmiviewerをつくった。
といっても/proc/meminfoを取得して積み上げグラフにしただけ。

active.png

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にあるわけではなく、何らかの方法で算出した値であることを示す。

active.png

グラフタイプbuff-cache

BuffersCached、つまりバッファキャッシュ(メタデータやraw I/O用のキャッシュ)とページキャッシュ(ファイル自体のページのキャッシュ)の変遷を見るとき用。

buff-cache.png

グラフタイプavailable

シンプルにMemAvailableとそれ以外を表示する。
Linux観点でSwappingが始まるまでの余力をザクッと見るとき用。

available.png

グラフタイプuser-kernel

ユーザ空間とカーネル空間のどちらで使っているかで分類してプロットする。
なんか使うことがあるかなとおもって用意したものの、デフォルトのactiveがあれば必要ない気がしないでもない。

user-kernel.png

環境

動作確認環境は、以下のとおり。

  • Ubuntu 18.04
  • Linux 5.0.0-29-generic
  • Python 3.6.8
  • matplotlib 2.1.1

とはいえあまり環境に依存する実装ではないので、
MemAvailableがある(3.14以降)Linux環境なら動くんじゃないかと。
もしかしたらadbモードならMac/Windowsでも動くかもしれない(未確認)。

おわりに

なにかお気づきの点やご要望などありましたらぜひご指摘ください。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5
Help us understand the problem. What are the problem?