大津です。
> なので,本当にメモリリークが発生していていずれはヒープが
> 枯渇するのか,それともフル GC が先延ばしにされているだけ
> なのかを見極める必要があるのではないかと思います.
そうですよねぇ。
ちょっと調べたら
socket.io の heartbeat を捕まえることができたので、1つ
の端末でクライアントから返ってきたタイミングの memoryUsage の変化を5分
程度見てみました。コードはこれです。
https://gist.github.com/2836908
heartbeat interval を極端に短く 0.1 秒にして node-v0.6.18 と 0.7.10-pre
(master) での比較です。GC のタイミングだけ見たいので値が減った時のみ出力
しています。頭はカウンターなのでだいたい0.1秒刻みのカウンターです。
(
socket.io 0.9.6 は master でも動くんですね。驚きでした。)
これみると極端なメモリーリークはなさそうですが、heap確保に伴ってメモリ利
用量は増えていますね。でも確保ができなくなった限界時の挙動で差が出るかも
しれないのでなんとも言えないです。V8 3.6 では 1G 限界でしたっけ? 確か今
はリミット外されているようなことを聞いた覚えがあります。
一度これでエージングしてみたらいかがでしょうか?
> node -e 'console.log(process.versions)'
> { node: '0.6.18',
> v8: '3.6.6.25',
> ares: '1.7.5-DEV',
> uv: '0.6',
> openssl: '1.0.1' }
> unixjp:~/tmp/socketio> node test.js
> info -
socket.io started
> client connected
> 93 { rss: 11591680, heapTotal: 5027296, heapUsed: 3502640 } 'delta:' { rss: 4096, heapTotal: 524288, heapUsed: -434016 }
> 194 { rss: 12124160, heapTotal: 5170176, heapUsed: 3547104 } 'delta:' { rss: 4096, heapTotal: 142880, heapUsed: -416068 }
> 311 { rss: 12214272, heapTotal: 5170176, heapUsed: 3571988 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -481880 }
> 429 { rss: 12230656, heapTotal: 5170176, heapUsed: 3598660 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -483576 }
> 547 { rss: 12242944, heapTotal: 5170176, heapUsed: 3625764 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -483580 }
> 664 { rss: 12259328, heapTotal: 5170176, heapUsed: 3654864 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -483748 }
> 782 { rss: 12271616, heapTotal: 5300736, heapUsed: 3681024 } 'delta:' { rss: 0, heapTotal: 130560, heapUsed: -484112 }
> 900 { rss: 12353536, heapTotal: 5300736, heapUsed: 3707880 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -483788 }
> 1018 { rss: 12365824, heapTotal: 5300736, heapUsed: 3734372 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -484048 }
> 1136 { rss: 12378112, heapTotal: 5300736, heapUsed: 3760760 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -484036 }
> 1251 { rss: 12398592, heapTotal: 5300736, heapUsed: 3797192 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -481168 }
> 1369 { rss: 12414976, heapTotal: 6471712, heapUsed: 3826752 } 'delta:' { rss: 0, heapTotal: 1170976, heapUsed: -481056 }
> 1610 { rss: 13021184, heapTotal: 6471712, heapUsed: 3877292 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -990048 }
> 1847 { rss: 13565952, heapTotal: 6471712, heapUsed: 3930112 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -971504 }
> 2084 { rss: 13590528, heapTotal: 6594112, heapUsed: 3980724 } 'delta:' { rss: 0, heapTotal: 122400, heapUsed: -972468 }
> 2322 { rss: 13680640, heapTotal: 6594112, heapUsed: 4035644 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -972676 }
> 2559 { rss: 13705216, heapTotal: 6594112, heapUsed: 4088056 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -972204 }
> 2796 { rss: 13799424, heapTotal: 6724672, heapUsed: 4138332 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -972556 }
> 3033 { rss: 13824000, heapTotal: 6847072, heapUsed: 4190640 } 'delta:' { rss: 0, heapTotal: 122400, heapUsed: -972548 }
> ~/tmp/github/node/node -e 'console.log(process.versions)'
> { http_parser: '1.0',
> node: '0.7.10-pre',
> v8: '3.11.1',
> ares: '1.7.5-DEV',
> uv: '0.6',
> zlib: '1.2.3',
> openssl: '1.0.0f' }
> unixjp:~/tmp/socketio> ~/tmp/github/node/node test.js
> info -
socket.io started
> client connected
> 165 { rss: 12722176, heapTotal: 8232576, heapUsed: 4473320 } 'delta:' { rss: 12288, heapTotal: 1048576, heapUsed: -870816 }
> 333 { rss: 14213120, heapTotal: 10263936, heapUsed: 4812396 } 'delta:' { rss: 4096, heapTotal: 0, heapUsed: -794844 }
> 511 { rss: 14606336, heapTotal: 10263936, heapUsed: 5091004 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -855820 }
> 693 { rss: 14774272, heapTotal: 10263936, heapUsed: 5267516 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -853648 }
> 875 { rss: 14598144, heapTotal: 10263936, heapUsed: 4374072 } 'delta:' { rss: -348160, heapTotal: 0, heapUsed: -1928132 }
> 1071 { rss: 14602240, heapTotal: 10263936, heapUsed: 4629124 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -901220 }
> 1250 { rss: 14606336, heapTotal: 10263936, heapUsed: 4806356 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -838748 }
> 1432 { rss: 14606336, heapTotal: 10263936, heapUsed: 4976116 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -850560 }
> 1613 { rss: 14651392, heapTotal: 12361088, heapUsed: 5148352 } 'delta:' { rss: 36864, heapTotal: 2097152, heapUsed: -852704 }
> 1994 { rss: 15818752, heapTotal: 12361088, heapUsed: 5512352 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -1784196 }
> 2362 { rss: 17039360, heapTotal: 12361088, heapUsed: 5875796 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -1703584 }
> 2624 { rss: 17338368, heapTotal: 12361088, heapUsed: 7339076 } 'delta:' { rss: -4096, heapTotal: 0, heapUsed: 14996 }
> 2733 { rss: 17395712, heapTotal: 12361088, heapUsed: 6235204 } 'delta:' { rss: 0, heapTotal: 0, heapUsed: -1707464 }
> 3104 { rss: 17776640, heapTotal: 13376768, heapUsed: 6611072 } 'delta:' { rss: 0, heapTotal: 1015680, heapUsed: -1707284 }