RPC包括:
消息的编码、解码、读取和发送;
转自:http://blog.csdn.net/woshisap/article/details/74022825
本文是对上述文章的总结、精简。
2.1. RPC调用的性能模型分析
2.1.1. 传统RPC调用性能差的三宗罪
网络传输方式问题;序列化方式问题;线程模型问题;
2.1.2. 高性能的三个主题
- 传输;2) 协议;3) 线程
2.2. Netty高性能之道
2.2.1. 异步非阻塞通信
Netty的IO线程
NioEventLoop由于聚合了
多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起
2.2.2. 零拷贝
- Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用
堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝
2) Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作
3) Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel
2.2.3. 内存池
对于缓冲区Buffer,特别是对于
堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了
基于内存池的缓冲区重用机制。
性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
2.2.4. 高效的Reactor线程模型
常用的Reactor线程模型有三种,分别如下:
- Reactor单线程模型;
- Reactor多线程模型;
- 主从Reactor多线程模型
2.2.5. 无锁化的串行设计理念
可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就
避免了多线程竞争和同步锁。通过调整NIO线程池的线程参数,可以
同时启动多个串行化的线程并行运行,这种
局部无锁化的串行线程设计相比
一个队列-多个工作线程模型性能更优。
2.2.6. 高效的并发编程
Netty的高效并发编程主要体现在如下几点:
- volatile的大量、正确使用;
- CAS和原子类的广泛使用;
- 线程安全容器的使用;
- 通过读写锁提升并发性能。
2.2.7. 高性能的序列化框架
影响序列化性能的关键因素总结如下:
- 序列化后的码流大小(网络带宽的占用);
- 序列化&反序列化的性能(CPU资源占用);
- 是否支持跨语言(异构系统的对接和开发语言切换)。
Netty默认提供了对Google Protobuf的支持
2.2.8. 灵活的TCP参数配置能力