推广

Netty 原理+高性能

iseeyu2年前 (2024-02-22)推广132

image.png

客户端通信序列图如下:

image.png

Netty 的IO 线程NioEventLoop 由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO 线程的运行效率,避免由于频繁IO 阻塞导致的线程挂起。

异步通信 NIO

由于Netty 采用了异步通信模式,一个IO 线程可以并发处理N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

零拷贝DIRECT BUFFERS (使用堆外直接内存)

  1. Netty 的接收和发送ByteBuffer 采用DIRECT BUFFERS,使用堆外直接内存进行Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket 读写,JVM 会将堆内存Buffer 拷贝一份到直接内存中,然后才写入Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
  2. Netty 提供了组合Buffer 对象,可以聚合多个ByteBuffer 对象,用户可以像操作一个Buffer 那样方便的对组合Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小Buffer 合并成一个大的Buffer。
  3. Netty 的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write 方式导致的内存拷贝

内存池(基于内存池的缓冲区重用机制)

随着JVM 虚拟机和JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。

高效的 Reactor线程模型

常用的Reactor 线程模型有三种,Reactor 单线程模型, Reactor 多线程模型, 主从Reactor 多线程模型。

Reactor 单线程模型:
Reactor 单线程模型,指的是所有的IO 操作都在同一个NIO 线程上面完成,NIO 线程的职责如下:

  1. 作为NIO 服务端,接收客户端的TCP 连接;
  2. 作为NIO 客户端,向服务端发起TCP 连接;
  3. 读取通信对端的请求或者应答消息;
  4. 向通信对端发送消息请求或者应答消息。

    image.png

由于Reactor 模式使用的是异步非阻塞IO,所有的IO 操作都不会导致阻塞,理论上一个线程可以独立处理所有IO 相关的操作。从架构层面看,一个NIO 线程确实可以完成其承担的职责。例如,通过Acceptor 接收客户端的TCP 连接请求消息,链路建立成功之后,通过Dispatch 将对应的ByteBuffer派发到指定的Handler 上进行消息解码。用户Handler 可以通过NIO 线程将消息发送给客户端。

Reactor 多线程模型
Rector 多线程模型与单线程模型最大的区别就是有一组NIO 线程处理IO 操作。 有专门一个NIO 线程-Acceptor 线程用于监听服务端,接收客户端的TCP 连接请求; 网络IO 操作-读、写等由一个NIO 线程池负责,线程池可以采用标准的JDK 线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO 线程负责消息的读取、解码、编码和发送;

image.png

主从Reactor多线程模型
服务端用于接收客户端连接的不再是个1 个单独的NIO 线程,而是一个独立的NIO 线程池。
Acceptor 接收到客户端TCP 连接请求处理完成后(可能包含接入认证等),将新创建的
SocketChannel 注册到IO 线程池(sub reactor 线程池)的某个IO 线程上,由它负责
SocketChannel 的读写和编解码工作。Acceptor 线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor 线程池的IO 线程上,由IO 线程负责后续的IO 操作。

image.png

无锁设计、线程锁定

Netty 采用了串行无锁化设计,在IO 线程内部进行串行操作,避免多线程竞争导致的性能下降。表面上看,串行化设计似乎CPU 利用率不高,并发程度不够。但是,通过调整NIO 线程池的线程参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。

image.png

Netty 的NioEventLoop 读取到消息之后,直接调用ChannelPipeline 的fireChannelRead(Object msg),只要用户不主动切换线程,一直会由NioEventLoop 调用到用户的Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。

高性能的序列化框架

Netty 默认提供了对Google Protobuf 的支持,通过扩展Netty 的编解码接口,用户可以实现其它的高性能序列化框架,例如Thrift 的压缩二进制编解码框架。

  1. SO_RCVBUF 和SO_SNDBUF:通常建议值为128K 或者256K。
    小包封大包,防止网络阻塞
  2. SO_TCPNODELAY:NAGLE 算法通过将缓冲区内的小封包自动相连,组成较大的封包,阻止大量小封包的发送阻塞网络,从而提高网络应用效率。但是对于时延敏感的应用场景需要关闭该优化算法。
    软中断 Hash 值和 CPU 绑定
  3. 软中断:开启RPS 后可以实现软中断,提升网络吞吐量。RPS 根据数据包的源地址,目的地址以及目的和源端口,计算出一个hash 值,然后根据这个hash 值来选择软中断运行的cpu,从上层来看,也就是说将每个连接和cpu 绑定,并通过这个hash 值,来均衡软中断在多个cpu 上,提升网络并行处理性能。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56199.html

相关文章

为何各种快速排名流行于市场呢。

为何各种快速排名流行于市场呢。

相信凡是在做过seo的朋友们应该都知道许多不同渠道的点击软件,而虽然说软件有时候的确能起到帮助网站上排名的作用,但是相反有时它也同样能给网站带来非常大的副作用,因此很多人也情缘付出代价也要尝试使用点击软件的原因。 但持续性刷点击虽然有一定的作用,但是作用并不是特别的大,而且这种刷点击的内...

关于减肥你必须知道的(能量摄入)

关于减肥你必须知道的(能量摄入)

首先我们先聊点基础的营养,无论你是增肌还是减脂,这些都是你需要了解的。减脂其实无非是制造热量缺口,增肌则是制造热量盈余,所以想要控制你的体重,归根结底,就是控制你能量的摄入和消耗。关于控制体重,有一个最基础的公式。能量摄入<能量消耗→体重减少,能量摄入>能量消耗→体重增加1...

网络营销有哪些策略。

网络营销有哪些策略。

要掌握,首先需要我们要有网络营销的思维,网络营销不是单纯的某一个在起作用,而是整体、系统性的营销布局和方案。网络营销方式是越来越多,小编为大家总结了以下几点。 一:公司品牌策略 首先公司经营的产品要确定自己的品牌,然后去推广企业自己的产品品牌,如果是知名的企业它的网下品牌可以得到很快宣...

品牌做好软文营销的“秘诀”——排名优化

说到提升影响力,是目前常用到的形式,相比于其他推广方式,软文营销的成本更低、风险更小,对于中小型企业而言更具优势,是一种值得长期使用的高效推广方式。不过面对如何做好软文营销,也成为不少企业品牌头疼的问题,那今天小编就来和大家分享下其中涉及到的“秘诀”,以助力大家都能通过软文...

网站改版怎样避免影响排名。

网站改版怎样避免影响排名。

SEO外包今日资讯:当我们的网站一改版,各页面的链接也会发生变化,会出现降权,关键词排名下降的问题,这个问题出现表示前面的工作白做一样,但网站改变也有相对应的问题的处理方法,那么网站改版后要怎么做才能不影响排名呢? 公司网站改版怎样避免影响排名? 1.在网站改版前,要将网站...

等你死了,他们好写10万+,好在朋友圈里转发!

等你死了,他们好写10万+,好在朋友圈里转发!

1 上星期发生的杨改兰一门六口自杀案,发生在甘肃省康乐县,上个月告破的白银市连环杀人案,也是在甘肃。 我这里不是要开地图炮,只是这两个惨案让我想起了一个甘肃籍的同学。在大学里某次寻常的宿舍夜谈时,他给我们讲了一个故事。 故事发生在甘肃某县城,有一个卖猪肉的屠户。从毛主席号召不分回汉,...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片