小林 (koichik) です.

V8 の GC の傾向として,ヒープが枯渇する直前まで
フル GC を先延ばしにしている様子が見受けられます.

Node 側ではイベントループがアイドルになったときに GC を
キックしていたはずですが,それではあまりゴミは回収されない
ようで,ヒープが足りなくなると一気に利用可能な領域が
元に戻る感じです.
その時はストップ・ザ・ワールドになるので,V8 の GC は
(少なくとも現時点では) サーバ向けではないんだろうな,
という印象を持っています.

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


On Wed, 30 May 2012 03:06:05 -0700 (PDT), koexuka <[email protected]> wrote:

> 大津さん
> koexukaです。
> 度々の返信ありがとうございます。
> 
> ちなみにベンチマークするクライアントでは socket.io-client がちゃんと動作 
> > していますでしょうか? (1000接続をどうシミュレートしたのか気になります。) 
> 
> 肝心な部分が伝え漏れていました。申し訳ございません。
> 
> クライアントは2パターンでテストしています。
> 1)ブラウザ(Mac版Firefox/Safari、socket.io-client)
> →複数タブ、ウィンドウで複数接続します。
> 2)Objective-Cによる実装
> →@growthfieldさんのNNSocketIO(https://github.com/growthfield/NNSocketIO)を使っています。
> 
> サーバ側で出力されるデバッグログですが、ブラウザでもObjective-Cでも
> [2012-05-30 18:25:53.065] [INFO] console - debug: 'emitting heartbeat for 
> client' '644389363226675471'                                               
>                  
> [2012-05-30 18:25:53.066] [INFO] console - debug: 'websocket writing' '2::'
> [2012-05-30 18:25:53.067] [INFO] console - debug: 'set heartbeat timeout 
> for client' '644389363226675471'
> [2012-05-30 18:25:53.068] [INFO] console - debug: 'got heartbeat packet'
> [2012-05-30 18:25:53.069] [INFO] console - debug: 'cleared heartbeat 
> timeout for client' '644389363226675471'
> [2012-05-30 18:25:53.069] [INFO] console - debug: 'set heartbeat interval 
> for client' '644389363226675471' 
> のように出ており、クライアント側は特に問題がないかなと思っています。
> 
> 
> ちなみに、ブラウザからsocket.io-clientを使って1接続のみで試してみた場合ですが、
> やはり少しずつ(10KB?30KB)、heartbeat interval秒ごとにNodeが使用するメモリが上昇していきます。
> 
> 
> ですが、ベンチマークのとり方、プログラムソースの間違いやクライアント側に問題がないかどうか、
> 再度確かめてみます。
> 
> 
> よろしくお願い致します。
> 
> 2012年5月30日水曜日 16時32分44秒 UTC+9 shigeki:
> >
> > 大津です。 
> >
> > > ベンチマークではサーバに対し多数(0?1000)接続 し、disconnectやconnect 
> > > を繰り返し 
> > > Nodeのメモリ使用量を監視していますが、 
> > > 定期的に使用量がグッと下がる(恐らくGC)ことはありますが、長いスパンで見 
> > > ると全体として増え続けています。 
> > > ※どこかのタイミングで接続数を0(ゼロ)にしてしばらく経過すると、メモリ使 
> > > 用量はNode起動時の状態に戻りますが、実運用ではあり得ない状態だと思います。 
> > > 
> > > この状態であれば、例えばメモリを2GB積んだサーバの場合、 
> > > 2?3日でメモリが枯渇してしまうのではないかと危惧しています。 
> >
> > ちょっと使用量が大きいですね。 
> >
> > ちなみにベンチマークするクライアントでは socket.io-client がちゃんと動作 
> > していますでしょうか? (1000接続をどうシミュレートしたのか気になります。) 
> >
> > socket.io の heartbeat はサーバから送信する時に毎回 setTimeout() でタイ 
> > マーを登録するので heartbeat が返ってこないとタイムアウト時間(default 60 
> > 秒)までタイマーが登録されたままです。デバッグ出力に 
> >
> >     debug - got heartbeat packet 
> >     debug - cleared heartbeat timeout for client XXXXXX 
> >
> > とか出力されていますか? 
> >


-- 
{
  name: "Koichi Kobayashi",
  mail: "[email protected]",
  blog: "http://d.hatena.ne.jp/koichik/";,
  twitter: "@koichik"
}

メールによる返信