Nettyに、tcpNoDelay
trueに設定しているアプリがあります(サーバーソケットと「子」ソケットの両方)。(Nはクライアントバッファを無効にします)を使用してサーバーに「カール」し-vN
、チャネルにデータをゆっくりと書き込むと、バッファ制限に達するまで何もクライアントに伝播されず、その後クライアントにプッシュされます。チャンクされたデータを書き戻していることに注意してください(クライアントは、閉じるまで接続されたままになります)。
Wiresharkを使用して、バッファ制限に達するまでクライアントに何も送信されないようにしました。その後、大量のTCPパケットがクライアントにフラッディングします。
理想的には、これはスムーズである必要があります。不思議なことに、これはローカルマシン(Mac OS X Lion、Java 1.6.0_31)で実行しているインスタンスでは発生しません。Ubuntu、Java1.6.0_20であるサーバーにのみ表示されます。_20から_31までのわずかなバージョンの不一致が理由だとは想像できません。
設定されているサーバーオプション:
nioStreamBootstrap.setOption("child.tcpNoDelay", true);
nioStreamBootstrap.setOption("child.keepAlive", true);
nioStreamBootstrap.setOption("tcpNoDelay", true);
クライアント「カール」:
curl -vN http://my.remote.server/some/path
私のログには、クライアントチャネルへの書き込みが示されています。
--- Message received from downstream
--- Writing message upstream
--- Message received from upstream
--- Writing message downstream
(「メッセージのダウンストリームへの書き込み」呼び出しが呼び出しの直前にあることに注意してくださいchannel.write(obj)
)
そのため、OS関連か、Java関連か、Netty関連かはわかりません。提案?