0

プログラム内でのフラッシュの使用に関する観察があります。私のテスト コードは、200 MB (それぞれ 128 バイトのチャンク) に相当するデータ < Channel.write(buffer) > を約 30 分間送り、そのような呼び出しごとに数ミリ秒の遅延があります。

< SimpleChannelHandler.writeComplete > へのコールバックを取得したら、< System.currentTimeMillis + WriteCompletionEvent.getWrittenAmount > をログに記録します。< Channel.write(buffer) > への必要な呼び出しでテストが完了すると、最初の 5 分間で 55 MB 相当のデータが約 1.6 mbps でフラッシュされ、残りの 25 分間で 140 MB @ 0.8 Mbps でフラッシュされることがわかりました。 . 最後の 25 分間で、書き込まれたデータのチャンクが 10 MB ( SimpleChannelHandler.writeComplete へのコールバックごと) に調整されていることがわかりました。

< SimpleChannelHandler.writeComplete > へのコールバックの平均遅延は、実行の最初の 5 分間で約 2 ミリ秒であり、実行の最後の 25 分間で 11500 ミリ秒に跳ね上がります。

この動作を理解するのを手伝ってください。また、実行の最後の 25 分間でバンプを回避するために調整できる場所を提案してください。

ここに私のセットアップ+コードに関するいくつかの情報があります:

クライアントとサーバー ノード間の接続は 1 GE で、ClientBootstrap.setOption の < sendBufferSize > と < receiveBufferSize > を < 16777216 > に設定しました。

チャネル パイプライン < pipeline.addFirst("bufferedWriter", new ConsolidatingAutoFlusher()); に BufferedWriteHandler のインスタンスがあります。>、そして < writeRequested > で < BufferedWriteHandler.flush(true) > を呼び出します

乾杯、サケット。

4

1 に答える 1

0

それで、すべての writeRequested(..) コールバックで BufferdWriteHandler.flush(true) を呼び出しますか? なぜあなたがこれをしたいのかわかりません。すべての writeRequested で実際にフラッシュする場合は、BufferedWriteHandler を持つ必要はまったくありません。それはパフォーマンスに悪い影響を与えるだけです。

于 2012-04-19T19:25:36.503 に答える