首页 > 其他分享 >Netty-在NIO基础上的优化

Netty-在NIO基础上的优化

时间:2023-12-13 23:45:39浏览次数:33  
标签:Netty NIO 线程 ByteBuf 拷贝 串行化 优化

零拷贝

零拷贝指的是,应用程序在需要把内核中的一块区域数据转移到另外一块内核区域去时,不需要经过先复制到用户空间,再转移到目标内核区域去了,而直接实现转移。

  1. 在网络通信上,使用直接内存。Netty 接收和发送 ByteBuf 采用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。
  2. 在缓存操作上Netty 提供了 CompositeByteBuf 类。它可以将多 Bteuf 合并为一个逻辑上的 ByteBuf,合并的过程其实仅仅是多个 ByteBuf 对象指针的映射,而不存在各个 ByteBuf 之间的拷贝。
  3. 在缓存操作上,Nety 的静态工具类 Unpooled 提供了 wrappedBuffer 方法。它可以将 bytel]、ByteBuf ByteBufer 等包装成个Netty ByteBuf 对象,包装过程中不会产生内存拷贝。
  4. 在缓存操作上,Netty 的 ByteBuf 还提供了 slice() 方法。它可以将 Byteuf 分解为多个共享同一个存储区域的 ByteBuf,从而避免了内存间的拷贝。
  5. 在文件传输上,Netty 通过 FileRegion 实现文件传输。而 FileRegion 其实正是基于 Java NI0 中的 FleChannel.transferTo)方法实现的,该方法可以将文件缓冲区的数据直接传输到目标 Channel,避免了内核缓存区和用户缓冲区之间的数据拷贝。另外,FileChannel.transferTo() 方法底层是基于 Linux 的 sendFile 函数实现的零拷贝

高性能无锁队列

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

具体来说,Netty 中的串行无锁化设计体现下如下2个方面

  1. Nety 是基于 Reactor 模型通过多路复用器接收并处理用户请求的。NIO 中的多路复用技术本身就是一种无锁串行化的设计思想
  2. Netty 中的 NioEventLoop 读取到消息之后,会执行 ChannelPipeline 中的 Handler,期间只要用户不主动切换线程,该用户的Handler 就会一直被同一个 NioEventLoop 调用,即同一个线程执行,这种串行化的处理方式避免了多线程操作而导致的锁的竞争,从性能角度来看是最优的。

 

标签:Netty,NIO,线程,ByteBuf,拷贝,串行化,优化
From: https://www.cnblogs.com/nxjblog/p/17900207.html

相关文章

  • 图篇增强优化
    目前还存在一些小问题,还得改改packagecom.example;importokhttp3.*;importorg.json.JSONException;importorg.json.JSONObject;importjavax.imageio.ImageIO;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListen......
  • 嵌入式代码优化技巧
    内存管理技巧1.C/C++工程应尽量避免深拷贝,尽量用浅拷贝(指针或者引用),如果指针需要频繁拷贝,用智能指针是一种不错的选择2.启用内存池管理线程的内存开销,事先在堆里边分配好,然后快速使用避免复杂的浮点运算1.复杂的浮点运算尽量避免,有些芯片是不支持硬件双精度浮点数的,比如全志T3,......
  • 嵌入式图像处理:算法、应用与性能优化
    嵌入式系统在现代科技中扮演着重要的角色,广泛应用于医疗设备、汽车、工业控制、智能家居等领域。嵌入式图像处理作为其中的一个关键组成部分,为许多应用提供了视觉感知能力。本文将介绍嵌入式图像处理的算法、应用以及性能优化方法,并提供相关的代码示例。嵌入式图像处理算法图像采集......
  • FQS:一种神奇的数仓查询优化技术
    本文分享自华为云社区《根据执行计划优化SQL【绽放吧!GaussDB(DWS)云原生数仓】》,作者:西岭雪山。引言如果您刚接触DWS那一定会好奇想要知道"REMOTE_FQS_QUERY"到底代表什么意思?我们看官网的描述是代表这执行计划已经CN直接将原语句下发到DN,各DN单独执行,并将执行结果在CN上进行汇......
  • Netty04-优化与源码
    优化与源码分析1.优化1.1扩展序列化算法序列化,反序列化主要用在消息正文的转换上序列化时,需要将Java对象变为要传输的数据(可以是byte[],或json等,最终都需要变成byte[])反序列化时,需要将传入的正文数据还原成Java对象,便于处理目前的代码仅支持Java自带的序列化,反......
  • Netty IO 和 Thrift IO
    1.NettyIONetty是一个高性能的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它极大地简化了网络编程,如TCP和UDP套接字服务器。异步和事件驱动:Netty基于事件驱动模型,可以处理成千上万个并发连接。高性能:优化的传输尝试减少资源消耗和延迟。......
  • SQL语句性能优化策略(转)
    本文会提到52条SQL语句性能优化策略。1、对查询进行优化,应尽量避免全表扫描,首先应考虑在WHERE及ORDERBY涉及的列上建立索引。2、应尽量避免在WHERE子句中对字段进行NULL值判断,创建表时NULL是默认值,但大多数时候应该使用NOTNULL,或者使用一个特殊的值,如0,-1作为......
  • 前端体验优化(2)——基建
    在2020年刚加入公司的时候,我就确定要持续推进基建的建设,经过这几年的沉淀,完成了从0到1的跨越。基建的目的是解决各类技术或业务问题,沉淀通用技术能力,提升工作效率,降低开发成本,直接或间接助力业务开展。接下来会围绕项目重构、组件化、标准化、工具化、自动化......
  • RTL级电路优化
    RTL常用逻辑写法判断两数之差等于1assignbma_eq_1=(b[11:0]-a[11:0]==1'b1)与下面的逻辑等效:assignbma_eq_1=&(({b[10:0]|~a[10:0],1'b0})^(b[11:0]^a[11:0]))加1减1写法assigna_p1[4:0]=a[4:0]+1'b1与下面的逻辑等效:assigna_p1[0]=~a[0];assig......
  • Fine-tuning: 一种针对大模型的优化策略
    在自然语言处理(NLP)领域,预训练模型已成为一种强大的工具,但其效果往往受到诸多因素的限制,包括模型大小、任务类型以及数据集等。针对这些问题,各种优化方法如微调(fine-tuning)、prompting等被相继提出。本文将深度解析P-tuningv2为何对大模型有效,主要体现在以下几个方面:一、连续提示的......