Java netty客户端性能/可扩展性:多线程写入一个通道与多个通道

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时性能提高,使

在netty 4.0.28中将多线程写入一个或多个通道时,我发现了一个可伸缩性问题。我找不到关于这个话题的任何相关信息。我只发现了“嘿,多线程提高了吞吐量”的问题,但我的问题却恰恰相反

一般来说,写入一个通道比写入多个通道快,我不知道为什么会这样,尤其是在等待写入完成时

我得到的结果是(writeAndFlush中间值,带升温和多次测试运行):

  • 单连接:不等待时每秒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();