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