From: SASADA Koichi Date: 2010-11-02T02:44:11+09:00 Subject: [ruby-dev:42509] memory usage of test-all  ささだです。  test-all がメモリ食いなので、調べていたんですが、ちょっと挙動がよくわ からないので、調べた結果を dump しておきます。原因を考えてみたんですが、 よくわかりませんでした。 ---- 物理メモリの消費の経過。 test_* メソッド実行ごとに計測。 横軸が時間経過(テストを実行した回数) 縦軸が /proc/self/statm で見た resident(物理メモリ量・単位 MB) http://www.atdot.net/fp_store/f.skt7bl/file.graph.png resident (lazy)  ふつーに test-all したもの resident (don’t_lazy) lazy sweep を禁止して test-all したもの resident (memsize_of) 毎回、memsize_of_all を実行したもの resident (each_object) 毎回 ObjectSpace.each_object したもの resident (all) GC.stat と memsize_of_all を実行したもの resident (clear stack) 毎回、alloca(4KB) して、0 クリアしたもの resident (gc) 毎回、GC したもの Excel の生データ: http://www.atdot.net/fp_store/f.krv7bl/file.test-all-memory-usage.xlsx VM 上の Linux で実行しており、775936 kBの物理メモリを割り当てている。メ モリ不足のため、途中で中断している。 > resident (lazy) > resident (don’t_lazy) > resident (clear stack) *というか、この「途中で中断」しちゃうので、test-all が開発環境で  まともに走らないで困っている。 -> この問題自体は、GC.start をスレッド大量生成するテストの後で 入れれば解決すると思うのですが、挙動自体に疑問があるため調べてます  ガクンとメモリ消費があがっているところは、スレッドを(大量に?)作成し ているところだということがわかっています。  毎回 GC すると、ところどころピークが見えますが、メモリ消費はかなりおさ えられています。  なぜか、memsize_of_all などで最後まで走りきるようになっています。メモ リ消費も、それなりに小さい。メモリ消費が抑えられているようです。lazy sweep を途中でキャンセルするからかな、とも思ったんですが、ならば don't lazy でも同じ挙動になるはずです。なぜ、memsize_of_all/each_object にする と、メモリ消費が抑えられるのか、謎です。  clear stack は、最後まで走りきらなかったけど、途中でそれなりの効果。  あと、GC が発生すれば、resident (gc) 程度までメモリ消費が減ることが理 想ですが、そうはなっていません。この辺は、malloc/free のタイミングが変わ るので、そのフラグメンテーションのせい、という気もします。  スレッド終了と、その利用リソース回収のタイミングで変なことが起こってい るのか? 実は、GC とか、そういう工夫じゃなくて、テスト間にウェイトを置 けばいい、とか?  というわけで、とりとめもなく。興味がある人がいたら調べて貰えるといいか なぁと。 -- // SASADA Koichi at atdot dot net