Maidsphere

2010.2.5

メモリ使用量を測りたい! というとき,君ならどうする? psを叩く? topコマンドを使う? もっといい方法があるよ それは,Valgrindを使うこと このValgrindっていうソフトは 複数のツール群からなる,メモリデバッガ・ヒーププロファイラ 簡単に言うと,メモリのプロファイリングを行えるツール群 「群」というからには 使えるツールが何種類かあって メモリの解放忘れや二重解放の検出,ヒーププロファイラやスレッドデバッガがある 具体的には,こんな感じ
Memcheck
メモリ管理に関する問題が検出できるツール.初期化していないメモリ領域や解放してしまったメモリ領域へのアクセスを検出できる.また,メモリリークやメモリの多重解放の検出も可能.「malloc」「new」「free」「delete」の各命令をラップし,すべてのメモリ読み書きを監視する.
Cachegrind
キャッシュプロファイラ.CPUのキャッシュ割り当てをシミュレーションすることで,キャッシュミスが起こるポイントを検出できる.
Callgrind
Cachegrindの拡張版.Cachegrindのすべての機能に加えて,関数の呼び出しが追える.
Massif
ヒーププロファイラ.プログラムのヒープを監視し,プログラムがどれだけメモリを使っているか監視できる.ヒープだけでなく,スタックも監視できるみたい.
Helgrind
スレッドデバッガ.スレッド間でのメモリ競合を検出できる.
今回の話のポイントは,このツール群の中にあるMassif これは,psやtopでは測りきれない細かいメモリの増減まで きっちりプロファイリングできる しかも,記録したメモリ使用量をグラフに出してくれる 便利! 使い方はググってもらえるとすぐわかるから省くけど ほかのやり方に比べてかなり詳細にデータがとれるので オススメです メモリ使用量を計測したいんだけど いい方法が思いつかないよ! という人はぜひこのツールを使ってみるといいと思います ちなみに,Massifは引数に与えられたプログラムを 自身の仮想計算機の中で実行して,プロファイリングしてるみたいなので どんなプログラムでも測定できます CやC++で書かれたプログラムはもちろん PHPやRuby,Pythonなどどんな言語もお手のもの! 以下蛇足 psって,値が曖昧で信用できないのよね topもしかり 本来プロセスの外部からそのプロセスが使用してるメモリ量を 正確に測るってことはかなり困難だし だって,そのプロセスしか「生きてる」メモリ領域を知らないんだからね ところで,psを叩いた時に出てくる物理メモリ使用量のカラムはRSSだけど これってなんの略? 「Resident Set Size」だと思ってたんだけど 最近「Real Storage Size」という表現を聞いて困惑中 ちなみに,メモリ使用の総量はRSS+VSZだからね RSSはプロセスに割り当てられたメモリ空間のうち 物理メモリ上に存在する領域の総量だけしか示してないから間違えないように!