2007/12/16
ローテクなメモリ使用量監視方法
GNU/Linux上のプロセスのメモリ使用量のローテクな監視方法です。 必要なのはシェルとgnuplotだけです。
シェルはこんなコードです。 やっていることはprocファイルシステムのstatmファイルの中身を一定期間ごとに読み出すだけです。 statmファイルの中身の意味を覚えたりはしないので、コードのusage出力に書いておきます(Linuxのソースコードからコピー)。 コマンドの使い方は変に文書化するより、このようにコマンド自体にしゃべらせる方が利便性と保守性に優れています。
メモリリークを調べるには、先頭カラム(size)の量を監視すれば充分です。 2番目のカラム(resident)は、RSSとも略されるメモリ使用量で、(そのプロセスが)実メモリを占めているメモリ使用量です(sizeは仮想メモリ上のメモリ使用量。ページアウトされた分も含みます)。
#!/bin/sh export LANG=C if [ "x"$1 = "x" ]; then echo "usage: $0 pid-to-watch" echo "usage example: $0 \`pidof process-name-to-watch\` | tee /tmp/mem.log" echo "output:# sprintf(buffer,\"%d %d %d %d %d %d %d\\n\"" echo " size, resident, shared, text, lib, data, 0)" exit fi pid=$1 while : do echo -n `date '+%Y-%m-%d-%H:%M'` ' ' cat /proc/${pid}/statm sleep 1m done
出力を適当なファイルに書き出して、gnuplotでグラフ化します。 そのためのスクリプトは次のようになります。
set xdata time set timefmt "%Y-%m-%d-%H:%M" set format x "%H:%M" # set xrange ["2007-12-11-16:00":] plot "/tmp/watch-mem.log" using 1:2 with lines
コメントアウトしている set xrange の行は、見たい範囲を限定したい時に使います。 iceweaselのメモリ使用量のグラフは次のようになりました。
メモリリークを調べたい時は、このグラフと(対象プロセスの)ログをつき合わせます。 こんなローテク、役に立つのか疑問に思うかもしれませんが、ハイテク(LeakTracer,ccmalloc,Valgrind,mpatrol)で見つからなかったメモリリークのバグの箇所を見つけられました。単にハイテクを使いこなせていないだけ、という噂もありますが。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/low-tech-to-watch-memory/tbping
- trac派に転向?
- ¦
- Main
- ¦
- クリスマスプレゼント