1

私は socket.io ベースのサーバーを作成しており、運命のピラミッドを回避し、メモリを低く抑えようとしています。私はこのクライアントを書きました - http://jsfiddle.net/QUDXU/1/で実行しnode client-cluster 1000ます。したがって、継続的なリクエストを行っている 1000 の接続。

サーバー側では、私がテストした3つの異なるソリューションを試しました。すべてを1時間実行した後、サーバーが使用するRAMに関する結果は次のとおりです。

  1. シンプルなコールバック - http://jsfiddle.net/DcWmJ/ - 112MB
  2. Qモジュール - http://jsfiddle.net/hhsja/1/ - 850MB以上
  3. 非同期モジュール - http://jsfiddle.net/SgemT/ - 1.2GB 以上

サーバーとクライアントは別のマシン上にあります。(Softlayer クラウド インスタンス)。ノード 0.10.12 および Socket.io 0.9.16

なぜこうなった?メモリを低く保ち、コードを読みやすくするための何らかのライブラリを使用するにはどうすればよいですか?

4

2 に答える 2

0

問題はサーバースクリプトではなく、クライアントスクリプトにあったようです。私は 1000 個のプロセスを実行し、各プロセスが毎秒サーバーにメッセージを送信しました。サーバーはこれらすべてのリクエストを解決するために非常に忙しくなっており、そのメモリをすべて使用していたと思います。クライアント側を次のように書き直してプロセッサの数に比例した数のプロセスを生成し、それぞれが次のように複数回接続します。

client = io.connect(selectedEnvironment, { 'force new connection': true, 'reconnect': false });

socket.io-client の同じインスタンスを使用して複数のクライアントを接続できるようにする「新しい接続を強制する」フラグに注意してください。私の問題を解決した部分は、実際にリクエストがどのように行われたかでした。クライアントは、毎秒ではなく、前のリクエストの確認を受け取ってから 1 秒後に別のリクエストを行います。1000 クライアントを接続すると、サーバーが ~100MB の RSS を使用して作成されます。また、サーバー スクリプトで async を使用しましたが、これは Q よりも非常にエレガントで理解しやすいようです。悪い点は、サーバーを約 2 ~ 3 日間実行していて、メモリが 250MB RSS に上昇したことです。これは、なぜかわかりません。

于 2013-07-31T07:47:23.640 に答える
0

オプション 1. cluster モジュールを使用して、ワーカーを適切に強制終了することができます (必ず最初に disconnect() を行ってください)。マスターで process.memoryUsage().rss > 130000000 を確認し、130MB を超えるとワーカーを強制終了できます。たとえば、:)

オプション 2. NodeJS にはメモリを使用する習慣があり、厳密なクリーンアップをめったに行いません。V8 が最大メモリ制限に達すると、GC 呼び出しがより積極的になります。そのため、ノード プロセスが使用できる最大メモリを下げるには、node --max-stack-size <amount>. 組み込みデバイスでノードを実行するときにこれを行います (多くの場合、利用可能な RAM は 64 MB 未満です)。

オプション 3. 本当にメモリを低く抑えたい場合は、可能な限り弱参照を使用します (実行時間の長い呼び出しを除くどこでも) https://github.com/TooTallNate/node-weak。このようにして、オブジェクトはより早くガベージ コレクションされます。ただし、すべてが機能することを確認するための広範なテストが必要です。これを使用する場合は GL :) https://github.com/TooTallNate/node-weak

于 2013-07-23T12:47:24.103 に答える