我想要一个非常有效的TCP客户端来发送谷歌协议缓冲消息.我一直在使用Netty库来开发服务器/客户端.
在测试中,服务器似乎能够每秒处理多达500k的事务,而不会遇到很多问题,但客户端往往会以每秒180k的事务数达到峰值.
我的客户端基于Netty文档中提供的示例,但区别在于我只想发送消息而忘记,我不想要响应(大多数示例都得到了).无论如何都要优化我的客户端,以便我可以实现更高的TPS?
我的客户应该维护多个渠道,还是应该能够通过单一渠道实现更高的吞吐量?
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);