Java netty客户端性能/可扩展性:多线程写入一个通道与多个通道
在netty 4.0.28中将多线程写入一个或多个通道时,我发现了一个可伸缩性问题。我找不到关于这个话题的任何相关信息。我只发现了“嘿,多线程提高了吞吐量”的问题,但我的问题却恰恰相反 一般来说,写入一个通道比写入多个通道快,我不知道为什么会这样,尤其是在等待写入完成时 我得到的结果是(writeAndFlush中间值,带升温和多次测试运行):Java netty客户端性能/可扩展性:多线程写入一个通道与多个通道,java,multithreading,netty,scalability,throughput,Java,Multithreading,Netty,Scalability,Throughput,在netty 4.0.28中将多线程写入一个或多个通道时,我发现了一个可伸缩性问题。我找不到关于这个话题的任何相关信息。我只发现了“嘿,多线程提高了吞吐量”的问题,但我的问题却恰恰相反 一般来说,写入一个通道比写入多个通道快,我不知道为什么会这样,尤其是在等待写入完成时 我得到的结果是(writeAndFlush中间值,带升温和多次测试运行): 单连接:不等待时每秒6.6百万次,等待时每秒约60千次 4个连接:不等待时为5.1M操作/秒,等待时为47K操作/秒 我观察到使用Oio时性能提高,使
- 单连接:不等待时每秒6.6百万次,等待时每秒约60千次
- 4个连接:不等待时为5.1M操作/秒,等待时为47K操作/秒
- 我观察到使用Oio时性能提高,使用Nio时性能降低
- 具有共享NioEventLoopGroup的Nio套接字
- 在2到4个写入线程之间(事件循环组线程=2*写入线程)
- 写小消息,写后刷新
- 对于测试:无读取,连接未关闭
- 在多个连接上写入比在单个连接上写入快(不一定是线性的,但仍应优于在一个连接上写入)
Bootstrap b = new Bootstrap();
b.group(eventLoopGroup);
b.channel(NioSocketChannel.class);
b.handler(new ChannelInitializer<NioSocketChannel>() {
@Override
public void initChannel(NioSocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
}
});
// Start the client.
ChannelFuture f = b.connect(socketAddress).await();
channel = f.channel();
或
完整的代码可以在中找到,这是一个非常简单的更改,直接使用
PooledByteBufAllocator
和java.nio.channels.SocketChannel
scores 600K ops/sec。默认情况下,4.0不使用PooledByteBufAllocator
。您可以指定ChannelOption.ALLOC
并重试吗?或者,您可以升级到4.1.0。不同的分配器不会影响4.0的结果。版本4.1.0.Beta5在没有等待承诺的情况下比4.0慢30-40%,在等待承诺的情况下慢15%。单个连接仍然比在多个连接之间分配写操作快(测试了所有四种组合)。套接字传输1-2MB/秒(根据Yourkit profiler),这很有趣。介意向复制者提出一个问题吗,这样我们可以试着了解问题是什么?
// non-blocking
channel.writeAndFlush(message, channel.voidPromise());
// blocking
channel.writeAndFlush(message).await();