如何编写高性能的Netty客户端

时间:2011-12-09 10:38:32

标签: tcp protocol-buffers netty

我想要一个非常有效的TCP客户端来发送谷歌协议缓冲消息。我一直在使用Netty库来开发服务器/客户端。

在测试中,服务器似乎能够每秒处理多达500k的事务,而不会遇到很多问题,但客户端往往会以每秒180k的事务数达到峰值。

我的客户端基于Netty文档中提供的示例,但区别在于我只想发送消息而忘记,我不想要响应(大多数示例都得到了)。无论如何都要优化我的客户端,以便我可以获得更高的TPS?

我的客户应该维护多个渠道,还是应该能够通过单一渠道实现更高的吞吐量?

2 个答案:

答案 0 :(得分:17)

1)如果客户只对发送感兴趣,而不是接收,您可以随时禁用以下频道的阅读

channel.setReadable(false);

2)通过为每个客户端提供多个客户端通道,您可以非常轻松地提高吞吐量,并且它也可以扩展。

3)您可以进行以下调整以改善一般性能(读/写)

  • 通过添加带有OrderdMemoryAwareThreadPoolExecutor的EXecutionHandler(最小,最大通道内存具有最佳值)来获得像pipline这样的SEDA更好

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    executionHandler1,//sharable
                    new MessageDecoderHandler(),
                    new MessageEncoderHandler(),
                    executionHandler2,//sharable
                    new BusinessLogicHandler1(),
                    new BusinessLogicHandler2());
        }
    });
    
  • 将频道的writeBufferHighWaterMark设置为最佳值(确保设置较大的值不会造成拥塞)

    bootstrap.setOption("writeBufferHighWaterMark", 10 * 64 * 1024);

  • 设置SO_READ,SO_WRITE缓冲区大小

    bootstrap.setOption("sendBufferSize", 1048576); bootstrap.setOption("receiveBufferSize", 1048576);

  • 启用TCP无延迟

    bootstrap.setOption("tcpNoDelay", true);

答案 1 :(得分:3)

我不确定“tcpNoDelay”是否有助于提高吞吐量。延迟是为了提高性能。尽管如此,我尝试了一下,发现吞吐量确实下降了90%以上。