3

誰かがこの問題で私を助けてくれることを願っています。

私たちの会社では、Java Push サーバーに接続された node.js サーバーをセットアップしています。

http および SLL 証明書の代わりに https モジュールを使用しています。

ノードとクライアント間の接続は、サーバーとクライアントで socket.io によって行われます。

node.js サーバーが Java サーバーのクライアントであると同時に、この接続は通常のソケット (net.connect) で行われます。

ユーザーがサーバーに接続し、いくつかのチャネルに参加し、Java サーバーからデータが到着すると、これが対応するユーザーにディスパッチされるという考え方です。

すべて正常に動作しているように見えますが、しばらくするとランダムに 450 から 700 人のユーザーがいて、サーバーの CPU が 100% に達し、すべての接続が切断されますが、サーバーはクラッシュしません。問題は、ブラウザで https://... にアクセスすると、404 などではなく、SSL 接続エラーであり、非常に高速であることです。

どこにでもログを追加しようとしましたが、パターンのようなものはなく、ランダムのようなものです。

誰かが同じ問題を抱えている場合、または手がかり、またはデバッグを改善するためのヒントを提供してくれる場合は、何でも感謝します。

どうもありがとう。

4

1 に答える 1

6

さて、問題は解決しました。これは、すべての Linux サーバーで発生する問題です。したがって、これらのいずれかを使用している場合は、これを読む必要があります。

その理由は、Linux サーバーが各プロセスごとに持つファイルのデフォルトの制限でした。

単一のLinuxサーバーには、各プロセスで開かれる1024個のファイルというこの制限があるようです。制限を確認するには、次のようにします。

# ulimit -n

この数を増やすには

# ulimit -n 5000 (for example)

各ソケットは新しい仮想ファイルを作成します。

何らかの理由で、サーバーにエラーが表示されず、サーバーがフリーズしてログが停止し、シグナルや証拠が何も表示されませんでした。送信を開始したのは、別のマシンにサーバーのコピーをセットアップしたときでした

warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
...

root でない場合は、現在のセッションでのみこれを変更し、永続的に変更しないので注意してください。

トリック: ファイルの数 (この場合は、ノード プロセスによって開かれたファイルの数) を数えたい場合は、プロセス ID をメモして、このコマンドを呼び出します。

# ls -l /proc/XXXXX/fd | wc -l

XXXXX はプロセス ID です。これは、これが問題であるかどうかを知るのに役立ちます.ノードサーバーを起動したら、このコマンドを使用して、ノードサーバーがトップに達したかどうかを確認し、フリーズ後に成長が停止するかどうかを確認できます. (デフォルトでは 1024 または「ulimit -n」)。

プロセスによって開かれているファイルのみを確認したい場合:

# ls -l /proc/XXXXX/fd

これがあなたを助けることを願っています。いずれにせよ、ノードjsサーバーをセットアップしている場合は、それが溶けないようにするためにそれをやりたいと確信しています。

最後に、ログのない将来のエラーで助けが必要な場合は、straceing またはdtrussing processを試すことができます

# strace -p <process-id> 

仕事をするべきです。

于 2013-05-13T06:20:45.127 に答える