3

我在使用 Netty 的套接字服务器的开发团队中。当客户端发送请求,服务器发送单个响应时,往返时间非常快。(GOOD) 我们最近注意到,如果来自客户端的请求触发了来自服务器的两条消息,即使服务器几乎同时将两条消息写入客户端,第一条消息和第二条消息之间也存在超过 200 毫秒的延迟到达远程客户端。使用本地客户端时,两条消息同时到达。如果远程客户端在来自服务器的第二条消息到达之前发送另一个请求,则立即发送第二条消息,但是来自新请求的两条消息都以超过 200 毫秒的延迟发送。

由于在使用 Netty 3.3.1 时注意到它,我尝试升级到 Netty 3.6.5,但我仍然看到相同的行为。我们使用的是 NIO,而不是 OIO,因为我们需要能够支持大量并发客户端。

是否有我们需要配置的设置来减少 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

200ms 让我觉得 Nagle 算法的神奇数字。尝试在两侧将 TcpNoDelay 设置为 true。

这是您为服务器端设置选项的方式。

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

这是针对客户端的。

    clientBootStrap.setOption("tcpNoDelay", true);

进一步阅读: http: //www.stuartcheshire.org/papers/NagleDelayedAck/

于 2013-04-12T02:03:48.360 回答