2012-01-26 6 views
3

Node.js HTTPSサーバに送信するPOSTまたはPUTリクエストの約10%が応答を得るのに2分かかります。残りの90%は期待どおりに動作します。ランダムPOSTまたはPUTリクエストで2分のレイテンシ

私はtsharkによって要求の本体がサーバーによって受信されたが、ServerRequestオブジェクトの 'data'イベントと 'end'イベントをトリガーするのに2分かかることを確認しました。

このレイテンシを経験する要求はランダムであるように見えますが、発生したときにパケットを受信するまでの待ち時間と「データ」および「終了」イベントは常に正確に2分です。

これらのリクエストのすべてについて、私は単一のパケットに到着する小さなjsonオブジェクトをポストしています。待ち時間が発生しているリクエストについては、セッションCookieがすぐに解析されるため、ヘッダーがアプリケーションによって受信されることがわかります。セッションの認証後、2分後に 'data'と 'end'イベントが最後に出力されるまで何も起こりません。その時刻にボディが解析され、データベースに保存されます。

これは、私のノードアプリケーションや、Amazon Linuxを実行しているEC2の小規模なインスタンスである自分のサーバーに問題がある可能性がありますか?リクエストの本文を含むパケットが到着してからアプリケーションにチャンクとして渡されるまでに2分かかりますか?

ありがとうございました。

更新: lib/http.jsのparser.onBodyを 'b'に変更するように変更しました。このメソッドが2分遅れて終了するまで呼び出されていないことがわかります。これは問題が私のアプリケーションよりも低いレベルにあることを示しているようです。私もec2のインスタンスを変更しましたが、それは助けになりませんでした。

+0

一貫して2分ですか?これらの要求に対してどれだけの作業が行われていますか?ガベージコレクションに関係することがありますか? http://stackoverflow.com/questions/5603011/node-js-and-v8-garbage-collection –

+0

はい、毎回正確に2分です。ほとんど動作しません - 私は解析されたURLを添付し、セッションクッキーを解析し、セッションオブジェクトをredisから接続します。私はそれのいずれかの遅延を見たことがない。私はそれがガベージコレクションではないと思います。なぜなら、私は普通のように他の投稿要求を受け取り続けることができます。 –

答えて

1

私は認証後にのみ「データ」イベントをリッスンしていました。私はreq.on('data', function(chunk) {req.body += chunk});をメインリスナー機能ではなく、認証後にコールバックに入れました。私がそれを聞き始める前に、しばしばペイロードが到着しました。

+0

アップデートを投稿してくれてありがとうAndrew –

3

各リクエストでノードアプリケーションが何をしているかを正確に把握しなければ、言うことは難しいです。たとえば、別のバックエンドサービスと通信する必要がある場合、ラム内のキャッシュからイメージを提供するだけとはかなり異なります。

EC2の小さなインスタンスは非常に気質がよいと言われています。彼らは他の顧客と大きく分かち合っているので、時には奇妙に反応しなくなることがあります。これを感じる方法の1つは、EC2インスタンスのコマンドラインで「トップ」を実行することです。 %st列を探します。これは盗みです。高い場合は、新しいEC2インスタンスに切り替えます。

関連する問題