大津さん、小林(koichik)さん
koexukaです。

情報ありがとうございます!

>小林さん
NodeのGCの説明、大変参考になります。

なので,本当にメモリリークが発生していていずれはヒープが 
> 枯渇するのか,それともフル GC が先延ばしにされているだけ 
> なのかを見極める必要があるのではないかと思います.

なるほどですね。
フルGCが先延ばしにされているかも、という考えはありませんでした。
僕が行ったベンチマークからだけですとその事が原因である可能性もかなり高いと思います。
また、ストップ・ザ・ワールドしてでもいずれ一気にメモリ解放される日が来るのであれば
個人的には全然嬉しい情報です。


この件では時間的に難しいですが、いずれ大量接続(とdisconnect)を繰り返しながら
ヒープが限界に達する2〜3日間ベンチマークを取り続ける試みもやってみたいです。

 
>大津さん
サンプルソースまで作成頂きありがとうございます。
ちょっと今バタバタしており、すぐ確認はできませんがあとで僕の環境でも試してみたいと思います!
頂いた結果を見て、また言われている通り極端なメモリリークは見られませんね。
僕の環境でもジワジワ〜・・・と増えたり減ったりを繰り返しながら、でも少しずつ増える、
という状態だったのですが、もう少しいろんなパターンでベンチを試してみたいと思います。

そういえば、node で手動GCできる方法があったなぁと思いだしたので、チョッ 
> ト試してみました。

Oh!!
MLに質問してよかったと、心から感じました!
この情報、とてもありがたいです。


600heartbeat毎にメモリ状況を出力した結果です。超マメGCは見事に heap使用 
> 量がそろってますね。他方 Node にお任せGCはバラバラ。 

本当ですね。
これが該当してる線が濃厚になってまいりました。
僕のベンチマーク処理にも超マメGC組み込んで試してみます。



まだ実際の動作は確認出来ておりませんが、取り急ぎ先に返事をさせて頂きます!

よろしくお願い致します。

2012年5月31日木曜日 10時42分00秒 UTC+9 shigeki:
>
> 大津です。 
>
> >> なので,本当にメモリリークが発生していていずれはヒープが 
> >> 枯渇するのか,それともフル GC が先延ばしにされているだけ 
> >> なのかを見極める必要があるのではないかと思います. 
>
> そういえば、node で手動GCできる方法があったなぁと思いだしたので、チョッ 
> ト試してみました。0.1秒毎に heartbeat を出し、クライアントから受け取った 
> らすかさずGCする例です。 
>
> https://gist.github.com/2840165 
>
> 600heartbeat毎にメモリ状況を出力した結果です。超マメGCは見事に heap使用 
> 量がそろってますね。他方 Node にお任せGCはバラバラ。 
>
> BenもMLで今の Node の 「idle だったら GC 呼び出す」のはいくつかのケース 
> でうまくいかないので今後アルゴリズムを変えると書いていましたので、今回の 
> ケースもそれに当てはまるケースじゃないですかね。 
>
> heartbeat受け取る毎に手動GC (node-v0.6.18) 
> > unixjp:~/tmp/socketio> node --nouse_idle_notification --expose_gc 
> test.js 
> >    info  - socket.io started 
> > client connected 
> > 0 { rss: 21876736, heapTotal: 16209952, heapUsed: 4284792 } 'delta:' { 
> rss: 0, heapTotal: 0, heapUsed: 0 } 
> > 600 { rss: 21417984, heapTotal: 15616032, heapUsed: 3648380 } 'delta:' { 
> rss: -458752, heapTotal: -593920, heapUsed: -636412 } 
> > 1200 { rss: 21422080, heapTotal: 24004640, heapUsed: 3644136 } 'delta:' 
> { rss: 4096, heapTotal: 8388608, heapUsed: -4244 } 
> > 1800 { rss: 21430272, heapTotal: 24004640, heapUsed: 3644208 } 'delta:' 
> { rss: 8192, heapTotal: 0, heapUsed: 72 } 
> > 2400 { rss: 21434368, heapTotal: 24004640, heapUsed: 3644256 } 'delta:' 
> { rss: 4096, heapTotal: 0, heapUsed: 48 } 
> > 3000 { rss: 21438464, heapTotal: 24004640, heapUsed: 3644292 } 'delta:' 
> { rss: 4096, heapTotal: 0, heapUsed: 36 } 
> > 3600 { rss: 21446656, heapTotal: 24004640, heapUsed: 3644332 } 'delta:' 
> { rss: 8192, heapTotal: 0, heapUsed: 40 } 
> > 4200 { rss: 21450752, heapTotal: 24004640, heapUsed: 3644364 } 'delta:' 
> { rss: 4096, heapTotal: 0, heapUsed: 32 } 
> > 4800 { rss: 21454848, heapTotal: 24004640, heapUsed: 3644704 } 'delta:' 
> { rss: 4096, heapTotal: 0, heapUsed: 340 } 
> > 5400 { rss: 21463040, heapTotal: 24004640, heapUsed: 3644760 } 'delta:' 
> { rss: 8192, heapTotal: 0, heapUsed: 56 } 
> > 6000 { rss: 21467136, heapTotal: 24004640, heapUsed: 3644792 } 'delta:' 
> { rss: 4096, heapTotal: 0, heapUsed: 32 } 
>
> Nodeによるお任せGC (node-v0.6.18) 
> > unixjp:~/tmp/socketio> node test.js 
> >    info  - socket.io started 
> > client connected 
> > 0 { rss: 23203840, heapTotal: 17729184, heapUsed: 9885436 } 'delta:' { 
> rss: 0, heapTotal: 0, heapUsed: 0 } 
> > 600 { rss: 25260032, heapTotal: 17729184, heapUsed: 12557360 } 'delta:' 
> { rss: 2056192, heapTotal: 0, heapUsed: 2671924 } 
> > 1200 { rss: 25821184, heapTotal: 18300640, heapUsed: 11676544 } 'delta:' 
> { rss: 561152, heapTotal: 571456, heapUsed: -880816 } 
> > 1800 { rss: 24408064, heapTotal: 16797408, heapUsed: 5267092 } 'delta:' 
> { rss: -1413120, heapTotal: -1503232, heapUsed: -6409452 } 
> > 2400 { rss: 24428544, heapTotal: 16797408, heapUsed: 7849444 } 'delta:' 
> { rss: 20480, heapTotal: 0, heapUsed: 2582352 } 
> > 3000 { rss: 12955648, heapTotal: 5329568, heapUsed: 3973844 } 'delta:' { 
> rss: -11472896, heapTotal: -11467840, heapUsed: -3875600 } 
> > 3600 { rss: 13090816, heapTotal: 5460128, heapUsed: 4127740 } 'delta:' { 
> rss: 135168, heapTotal: 130560, heapUsed: 153896 } 
> > 4200 { rss: 13225984, heapTotal: 5590688, heapUsed: 4258476 } 'delta:' { 
> rss: 135168, heapTotal: 130560, heapUsed: 130736 } 
> > 4800 { rss: 12963840, heapTotal: 5321408, heapUsed: 3672084 } 'delta:' { 
> rss: -262144, heapTotal: -269280, heapUsed: -586392 } 
> > 5400 { rss: 13103104, heapTotal: 5451968, heapUsed: 3826204 } 'delta:' { 
> rss: 139264, heapTotal: 130560, heapUsed: 154120 } 
> > 6000 { rss: 13238272, heapTotal: 6622944, heapUsed: 3955288 } 'delta:' { 
> rss: 135168, heapTotal: 1170976, heapUsed: 129084 } 
>
>

メールによる返信