2017-07-27 23 views
0

HTTP2でJerseyを使用しています。トラフィックが少し高くなり、例外が発生したとき。そして私は、pcapがFINを受け取らずにFIN/ACKを送ることを発見しました。私はそれがサーバー側からの接続を閉じるための単一のFINであるとは確信していません。または、単一のFINとACKを組み合わせて以前のパケットにします。後者は、クライアントがFINを送信しなかったために表示されます。だから問題は、サーバーが小さなトラフィックの下でFINを送信する理由です。そして、私はrece_qとsend_qが非常に低いことを発見しました。 CPU使用率があまり高くありません。私はすでにいくつかのTCPパラメータを調整しており、結果は同じです。この動作は不安定ですが、いつかはOKですが、まあまあOKではありません。私は(同じTPSと)より多くのリクエストを追加するとOKではありません。サーバーが接続を完了したように見えますが、正確な理由はわかりません。それはHTTP2に関連していますか?正確な理由を確認する場所がありますか?HTTP2サーバがFIN/ACKを送信し、その後にRSTを送信します。

以下はpcapスナップショットです。

pcap snapshot


アップデート2017年7月30日 デバッグログ:

Sun Jul 30, 2017 8:31:35.591 PM org.glassfish.grizzly.http2.Http2FrameCodec parse 
 
FINE: Rx [2]: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=277, type=0, flags=[none], length=42, data=BuffersBuffer (154351355) [pos=0 lim=42 cap=42 bufferSize=1 buffers=[HeapBuffer (165674143) [pos=0 lim=42 cap=8391], null, null, null]]} 
 
Sun Jul 30, 2017 8:31:35.673 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames 
 
FINE: Http2ConnectionException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing 
 
Sun Jul 30, 2017 8:31:35.684 PM org.glassfish.grizzly.http2.Http2FrameCodec serializeAndRecycle 
 
FINE: Tx: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=GoAwayFrame {streamId=0, type=7, flags=[none], length=64{lastStreamId=199, errorCode=REFUSED_STREAM}
とのpcapスナップショット内のストリーム277

pcap contains stream 277 from No 270,271 and 272

269パケットにSETTINGSパケットがあります。輸送の途中で設定を送信するのは普通ですか?そして269の後に、3つのパケット270,271と272が蒸気277を使用している。

約8:31:35.684私はGOWAYパケットを見つけられなかった。しかし、8:31:36.035 RST/ACKだけが送信されます。ラウンド時にデバッグログは以下の通りです:

Sun Jul 30, 2017 8:31:36.020 PM org.glassfish.grizzly.http2.Http2FrameCodec parse 
 
FINE: Rx [2]: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=465, type=0, flags=[END_STREAM], length=0, data=ByteBufferWrapper (1101850112) [visible=[java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]]]} 
 
Sun Jul 30, 2017 8:31:36.023 PM org.glassfish.grizzly.http2.Http2BaseFilter processDataFrame 
 
FINE: Data frame received for non-existent stream: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=277, type=0, flags=[END_STREAM], length=0, data=ByteBufferWrapper (1101850112) [visible=[java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]]]}, stream=277 
 
Sun Jul 30, 2017 8:31:36.024 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames 
 
FINE: Http2StreamException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing 
 
Sun Jul 30, 2017 8:31:36.025 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames 
 
FINE: Http2ConnectionException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing

ログは、この流れはまさに最初のログに記録されたストリームである非存在ストリーム277を受け取った示しました。このスチーム277がRST/ACKを次の数ミリ秒で発生させるかどうかわからない。パケット269〜272とストリーム277に何らかの問題があると思います。

今のところ、FIN/ACKはありません。

+0

8でのログ行:31:35.591 'HEADERS'フレームは何とか​​ストリーム277のために解析されたことを示しているようだが、どうやら' GOAWAY'を起こし、成功しませんでした。 'FINEST'ログレベルを試しましたか?おそらくそれは何がうまくいかなかったのかをより多く示しているのかもしれないまた、あなたは、このような桟橋HTTP/2などの別の実装を試してみました(免責事項、私は、突堤HTTP/2メンテナですか)? – sbordet

+0

実は私は、ジャージーに桟橋HTTP/2を注入して設定する方法がわかりません。私はジャージーでは非常に限られたHTTP/2コンテナの使用しか見つけることができません。これについてもっと情報を提供できると感謝しています。ありがとう。 – user3675334

+0

私はFINESTにログを設定しているが、その後、GoAwayFrameを送っ同じ、プロセスのエラーを探します。 pcapでは、RST/ACKが最後に送信されます。しかし、私は今日のpcapで気づいた別の奇妙なことと私は昨日のpcapで見つけた。 RST/ACKを送信するまでサーバーの収量は応答しませんでした。応答も大きなものでしたが、予想されるすべての応答は含まれていませんでした。昨日のpcapは、クライアントへのRST/ACKパケット以外の応答もありませんでした。 – user3675334

答えて

0

pcapは、サーバー上で異常終了しています。

なぜ発生したのかについては、サーバーログを確認してください。

考えられる原因としては、サーバーの不具合が考えられます。

もう1つの考えられる原因は、クライアントが無効なHEADERSフレームをパケット14で送信したことです。それでも、サーバーは接続を閉じるだけでなく、GOAWAYフレームを送信する必要があります。

パケット17でRSTクライアントがFINを処理する前に、パケット16でHEADERSフレームを送信するので、正常なので、サーバは、送信されたデータがユーザコード層にそれを行っていないことを示すRSTで応答します。

サーバーのログは、(おそらく、DEBUGレベルで)あなたに何が起こったかについての詳細を教えてください。

+0

私はそれを試し、あなたに後で戻ってきます。 – user3675334

+0

私はデバッグログといくつかの発見で更新しました。見ることを助けてください。ありがとう。 – user3675334

関連する問題