3

包囲を使用して、node.js サーバー (小さな webapp) の負荷テストを行っていました。300 のような少数の同時接続でも、いくつかのエラーが表示されることがわかりました。

siege -c 300 -n myserver.com:3000

次に、次のような結果が表示されました

[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer

サーバーが接続を閉じていることがわかりました。なぜそうなのか。どうすればデバッグできますか。4 GB のメモリを搭載した Macbook Pro でサーバーを実行しています。Websocket を使用したことをお知らせします。つまり、クライアントは node.js で実行されている Web サーバーによって返されたページにアクセスします。次に、このページは WebSocket を使用して同じサーバーに接続し、双方向通信を行います。何がそのような問題を引き起こす可能性がありますか?

4

1 に答える 1

4

ソケットが不足していると思われる状況に陥った場合、確認すべきことが 2 つあります。

  1. ソケットを明示的に閉じていることを確認してください。一部の言語では、ガベージ コレクターのファイナライズ ロジックがクリーンアップされますが、これには遅延が伴い、ずさんです。これを行わない他の言語では、アプリケーションは終了するまでソケット (およびファイル ハンドル) を「リーク」します。
  2. OS がアプリケーションのユーザー アカウントに、テストに十分なピーク ソケットを許可するようにします。

ポイント 1 に対処するには: ソケットを閉じていますか? 私は node.js のヘビーユーザーではありませんが、次のように考えています。

var conn = new net.Socket();
conn.destroy(); //Are you doing this?

ポイント 2 に対処するには: ハード オープン ファイルとソフト オープン ファイルの制限を、邪魔にならないように十分高い値に設定します。

launchctl limit maxfiles 8192 8192

引数なしで実行sudo launchctl limitすると、現在の制限が出力されます。詳細については、launchctl に関する Apple のドキュメントを参照してください。

于 2013-01-30T06:52:12.903 に答える