Netty:如何减少来自服务器的连续消息之间的延迟?

问题描述 投票:0回答:2

我在使用 Netty 的套接字服务器的开发团队中。 当客户端发送请求,服务器发送单个响应时,往返时间非常快。 (好)我们最近注意到,如果客户端的请求触发服务器发送的两条消息,即使服务器几乎同时将两条消息写入客户端,但第一条消息和第二条消息之间存在超过 200ms 的延迟到达远程客户端。 当使用本地客户端时,两条消息同时到达。 如果远程客户端在服务器的第二条消息到达之前发送另一个请求,则第二条消息会立即发送,但新请求的两条消息都会延迟超过 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;
}

writer工厂使用ChannelBuffers.dynamicBuffer(defaultMessageSize)作为缓冲区,当我们写入消息时它是Channels.write(channel, msg)。

还有什么有用的? 将代码迁移到 Netty 的开发人员目前不在,我正在尝试填补。

java sockets delay netty
2个回答
9
投票

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

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

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

这是针对客户端的。

    clientBootStrap.setOption("tcpNoDelay", true);

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


0
投票

从 Netty 4 开始,可以使用类型选项

// server
serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);

// client
clientBootStrap.setOption(ChannelOption.TCP_NODELAY, true);
© www.soinside.com 2019 - 2024. All rights reserved.