小林 (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" }
