无锁化的串行设计理念
在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来 严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息 的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。
为了尽可能提升性能,Netty 采用了串行无锁化设计,在 IO 线程内部进行串行操作,避免多线程竞争导致的性能下降表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 NIO 线程池的线程参数,可以同时启动 多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。
Netty 的串行化设计工作原理图如下:

![]()
Netty 的 NioEventLoop 读取到消息之后,直接调用 ChannelPipeline 的 fireChannelRead(Object msg),只要用户不主 动切换线程,一直会由 NioEventLoop 调用到用户的 Handler,期间不进行线程切换,这种串行化处理方式避免了多线 程操作导致的锁的竞争,从性能角度看是最优的。
多数场景下并行多线程处理可提升并发性能,但共享资源并发访问处理不当会致锁竞争、性能下降。为避免此损耗,可采用串行化设计。Netty采用串行无锁化设计,在IO线程内部串行操作,通过调整线程参数可并行运行多个串行化线程,避免多线程锁竞争,性能更优。
855

被折叠的 条评论
为什么被折叠?



