Java与Netty实现高性能高并发( 五 )


1) volatile的大量、正确使用;
2) CAS和原子类的广泛使用;
3) 线程安全容器的使用;
4) 通过读写锁提升并发性能 。
如果大家想了解Netty高效并发编程的细节,可以阅读之前我在微博分享的《多线程并发编程在 Netty 中的应用分析》,在这篇文章中对Netty的多线程技巧和应用进行了详细的介绍和分析 。
2.2.7. 高性能的序列化框架
影响序列化性能的关键因素总结如下:
1) 序列化后的码流大小(网络带宽的占用);
2) 序列化&反序列化的性能(CPU资源占用);
3) 是否支持跨语言(异构系统的对接和开发语言切换) 。
Netty默认提供了对google Protobuf的支持,通过扩展Netty的编解码接口,用户可以实现其它的高性能序列化框架,例如Thrift的压缩二进制编解码框架 。
下面我们一起看下不同序列化&反序列化框架序列化后的字节数组对比:

Java与Netty实现高性能高并发

文章插图
图2-26 各序列化框架序列化码流大小对比
从上图可以看出,Protobuf序列化后的码流只有Java序列化的1/4左右 。正是由于Java原生序列化性能表现太差,才催生出了各种高性能的开源序列化技术和框架(性能差只是其中的一个原因,还有跨语言、IDL定义等其它因素) 。
2.2.8. 灵活的TCP参数配置能力
合理设置TCP参数在某些场景下对于性能的提升可以起到显著的效果,例如SO_RCVBUF和SO_SNDBUF 。如果设置不当,对性能的影响是非常大的 。下面我们总结下对性能影响比较大的几个配置项:
1) SO_RCVBUF和SO_SNDBUF:通常建议值为128K或者256K;
2) SO_TCPNODELAY:NAGLE算法通过将缓冲区内的小封包自动相连,组成较大的封包,阻止大量小封包的发送阻塞网络,从而提高网络应用效率 。但是对于时延敏感的应用场景需要关闭该优化算法;
3) 软中断:如果linux内核版本支持RPS(2.6.35以上版本),开启RPS后可以实现软中断,提升网络吞吐量 。RPS根据数据包的源地址,目的地址以及目的和源端口,计算出一个hash值,然后根据这个hash值来选择软中断运行的cpu,从上层来看,也就是说将每个连接和cpu绑定,并通过这个hash值,来均衡软中断在多个cpu上,提升网络并行处理性能 。
Netty在启动辅助类中可以灵活的配置TCP参数,满足不同的用户场景 。相关配置接口定义如下:
Java与Netty实现高性能高并发

文章插图
图2-27 Netty的TCP参数配置定义
2.3. 总结
通过对Netty的架构和性能模型进行分析,我们发现Netty架构的高性能是被精心设计和实现的,得益于高质量的架构和代码,Netty支持10W TPS的跨节点服务调用并不是件十分困难的事情 。




推荐阅读