netty客户端性能/可伸缩性:多线程写入一个通道与多个通道

时间:2015-06-26 08:04:32

标签: java multithreading netty scalability throughput

我遇到了一个问题,我注意到在netty 4.0.28中将多线程编写到一个或多个通道时具有可伸缩性。关于这个话题我什么都找不到。我发现只有"嘿,多线程提高了吞吐量"但是我的问题与此相反。

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

我得到的结果是(writeAndFlush中位数,加温和多次测试运行):

  • 单连接:6.6M ops / sec无需等待,约60K ops / sec等待
  • 4个连接:5.1M ops / sec无需等待,约47K ops / sec等待
  • 我在使用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();

// non-blocking
channel.writeAndFlush(message, channel.voidPromise());

// blocking
channel.writeAndFlush(message).await();

完整代码位于https://gist.github.com/mp911de/7a3d7206931c8c4dc581

0 个答案:

没有答案