[groonga-dev,01783] Re: mroongaのメモリーリーク(の疑い)について

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 9月 17日 (火) 23:11:45 JST


須藤です。

In <52381****@rozet*****>
  "[groonga-dev,01780] mroongaのメモリーリーク(の疑い)について" on Tue, 17 Sep 2013 18:15:58 +0900,
  磯部 和広 <k-iso****@rozet*****> wrote:

> ■質問■
> 
> MySQLをselectオンリーで使い続けると
>  クエリキャッシュの増加
> 以外は起きないと考えています。
> 
> マシンはメモリが32GBで、mroongaのデータが11GBですので
> mroongaによるメモリーリーク以外に、上記現象が起きる原因は思い当たらない
> のですが、他に考慮する現象はあるでしょうか。

うーん、メモリーリークなんですかねぇ。。。
以下を教えてもらえますか?

  1. 「一定時間内に応答しない」ときのmysqldプロセスの
      VIRT/RES/SHRの値(topで確認したもので十分です。)

  2. /proc/${mysqldのPID}/mapsの中身(大きいです。)

     ファイルにマップされていないメモリ領域が多かったらメモ
     リーリークの可能性が高くなるなぁと思っています。

     手元のシェルのヒストリーにはこんなワンライナーが残ってい
     ました。これでメモリ使用量を眺めていたみたいです。

     % watch -n 1 'cat /proc/$(cat groonga.pid)/maps | ruby -e "ARGF.each_line {|line| range = line.split[0]; file = line.split[5]; low, high = range.split(/-/); usage = high.to_i(16) - low.to_i(16); puts %Q[#{usage}\t#{file}]}" | sort -r -n'


手元で再現するなら、↓な感じでどのクエリーが問題かを絞り込ん
で、それからコードのどこらへんが問題かを絞り込んでいったりし
ます。クエリーがわかればあとはこっちでできるのですが、そこま
でいくのはなかなか難しいですよねぇ。。。

  1. 確実に再現するクエリーのパターンを見つける。
     この時点では1日流すと再現するとか長くても構わない。
  2. 1.で再現したクエリーのパターンを2分割にする。
  3. 前半を流して再現 && 後半を流して再現しない
     (前半再現しない && 後半再現なら以降の前半・後半を逆にする。)
  4. 前半が問題なので、以降、後半は無視
  5. 前半をさらに半分にする
  6. 2.からくりかえす
     (できれば1つのクエリーがわかるまで。無理ならできるだけ。)
  7. 問題のクエリーをステップ実行したりデバッグログをだした
     りして実行パスを確認
  8. 実行パスを前半と後半にわけて…↑と同じようなことをする


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




groonga-dev メーリングリストの案内
Back to archive index