我在使用 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 的开发人员目前不在,我正在尝试填补。
200 毫秒让我觉得这是 Nagle 算法的神奇数字。尝试将两侧的 TcpNoDelay 设置为 true。
这是为服务器端设置选项的方式。
serverBootstrap.setOption("child.tcpNoDelay", true);
这是针对客户端的。
clientBootStrap.setOption("tcpNoDelay", true);
从 Netty 4 开始,可以使用类型选项:
// server
serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);
// client
clientBootStrap.setOption(ChannelOption.TCP_NODELAY, true);