3

私は、Netty を使用するソケット サーバーの開発チームに所属しています。クライアントが要求を送信し、サーバーが単一の応答を送信する場合、往復時間は非常に高速です。(GOOD) 最近、クライアントからのリクエストがサーバーからの 2 つのメッセージをトリガーする場合、サーバーが両方のメッセージをほぼ同時にクライアントに書き込む場合でも、最初のメッセージと 2 番目のメッセージの間に 200 ミリ秒以上の遅延があることに気付きました。リモートクライアントに到着。ローカル クライアントを使用すると、2 つのメッセージが同時に到着します。サーバーからの 2 番目のメッセージが到着する前にリモート クライアントが別の要求を送信した場合、その 2 番目のメッセージはすぐに送信されますが、新しい要求からの 2 つのメッセージは両方とも 200 ミリ秒以上の遅延で送信されます。

Netty 3.3.1 を使用しているときに気がついたので、Netty 3.6.5 にアップグレードしようとしましたが、それでも同じ動作が見られます。多数の同時クライアントをサポートできるようにする必要があるため、OIO ではなく NIO を使用しています。

その 200 ミリ秒以上の遅延を減らすために構成する必要がある設定はありますか?

コードスニペットを追加する編集。これらが最も関連性の高い部分であることを願っています。

@Override
public boolean openListener(final Protocol protocol,
        InetSocketAddress inetSocketAddress) throws Exception {
    ChannelFactory factory = new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(),
            Executors.newCachedThreadPool(),
            threadingConfiguration.getProcessorThreadCount());

    ServerBootstrap bootstrap = new ServerBootstrap(factory);

    final ChannelGroup channelGroup = new DefaultChannelGroup();
    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
               .... lots of pipeline setup snipped ......
    });

    Channel channel = bootstrap.bind(inetSocketAddress);

    channelGroup.add(channel);

    channelGroups.add(channelGroup);

    bootstraps.add(bootstrap);

    return true;
}

ライター ファクトリは、バッファーに ChannelBuffers.dynamicBuffer(defaultMessageSize) を使用し、メッセージを書き込むときは Channels.write(channel, msg) です。

他に何が役に立ちますか?コードを Netty に移行した開発者は現在不在で、私が記入しようとしています。

4

1 に答える 1

8

200 ミリ秒は、ネーグルのアルゴリズムのマジック ナンバーのように思えます。両側で TcpNoDelay を true に設定してみてください。

これは、サーバー側のオプションを設定する方法です。

    serverBootstrap.setOption("child.tcpNoDelay", true);

これはクライアント側用です。

    clientBootStrap.setOption("tcpNoDelay", true);

さらに読む: http://www.stuartcheshire.org/papers/NagleDelayedAck/

于 2013-04-12T02:03:48.360 に答える