okkyの日記: メモリリークを見つけるのが難しい
普通に malloc/free しているプログラムならばまだいいのだが…
JVMがメモリリークしているとか、kernelがメモリリークしているとかだと、短期的には見分けがつけられない。何かよい手は無いだろうか…
JVMとかの場合、allocation のタイミングはわかるのだが、GCが解放するタイミングは「メモリチャンクが不要になったタイミング」とは無関係。GCは重たい処理なので、後回しにできるものならば後回しにしたい。するとあるタイミングのJVMのメモリサイズを見ても、はて、これが妥当であとで回収されるのか、本当にそれだけのメモリを消費しているのか、それともメモリリークをしているのか…判らない。
kernelのように「余っているメモリは file cache」という場合も似たような感じ。一日ぐらい動かしている Linux マシンで、kernelが「free」と認識しているメモリはほとんどない。slab領域だって free したらいきなり計上しなくなるわけではな…かったはずだ。ちょっと記憶が曖昧だな。slashing を起こしてページが浪費されているのか、メモリリークを起こしているのか、知るのは難しい。
.
誰かメモリリークが起こったときの、この手のソフトの挙動を統計的に分析している人はいないだろうか?? 10分とかに1度の割合で情報をサンプリングして、それを2週間とか1ヶ月とか以上の時間、取得し続けたときの特徴を調べてくれているとうれしいのだが…短期的に露呈するようなメモリリークは調べなくても判る(マシンがすぐこける)ので、そういうのはターゲットにしなくていい。
個人的な予測では次のような傾向が出るんじゃないかと思う。
仮に、過去10日間の平均値を「長期的平均値」、過去1日分の平均値を「短期的平均値」あるいは単に「平均値」、過去一日分のサンプリング結果の分散(平均値以上と以下、それぞれについて)を『短期的分散』と呼ぶとして:
メモリリークを起こしていないならば中長期的には総メモリ消費量の平均値はある程度の周期で安定する。また、平均値以上、平均値以下それぞれの分散は、メモリリークをしていなければ「長期的平均値」よりも上にいるときは下方向の分散が大きく、「長期的平均値」よりも下にいるときは「上方向の分散が大きい」形を取ると思う(一種のランダムウォークになるはずだから)。
これに対して、メモリリークを起こしている場合、平均値が長期的平均値に対してどこにいても、上下の分散に大きな差が見られない。中長期的な平均値は徐々に増えていく。
: という特徴があるんじゃなかろうか、という気がする。JVMもkernelも。ただし、JVMは「どこを」観察すればいいのかは比較的簡単だとして、kernelの場合は /proc/meminfoなのか何を見ればいいのか…も悩みどころ。
うーん。どこかにそういうのを実験している人たちはいないものか。
自動的に分析して、メモリリークくさいと自動的に warning を上げるシステムは無いものか。
RedHat とか RedHat とか Google とか Google とか Google とか。
「計画運用としてのシステムリブート」内に収めることができるかどうかを予測できるととてもいいんだけれどなぁ。
.
なお、個人的には予算だけ合っても被験者がいないと駄目なので、難しいです。この辺は、医学とかと同じで、患者が(たくさん)いてくれないと…
メモリリークを見つけるのが難しい More ログイン