当前位置: 首页 > news >正文

【Netty源码解读和权威指南】第31篇:Netty零拷贝深度解析——性能极致的秘密武器

上一篇【第30篇】Netty写数据源码解析——write/flush背后的双队列设计
下一篇【第32篇】Netty背压机制——不让发送方"撑死"接收方


开篇故事

某文件传输系统,传输1GB文件CPU飙到90%。排查:每次发送都要memcpy从堆内拷贝到堆外!

优化后:使用FileRegion.TransferTo,直接DMA传输,CPU降到5%!

零拷贝 = 不进行CPU参与的memcpy


一、传统vs零拷贝对比

传统方式(4次拷贝+2次上下文切换): 磁盘→内核缓冲区→用户缓冲区→Socket缓冲区→网卡 ↑ DMA ↑ CPU memcpy ↑ CPU memcpy ↑ DMA 零拷贝(sendfile)(2次拷贝+0次上下文切换): 磁盘→内核缓冲区→Socket缓冲区→网卡 ↑ DMA ↑ DMA(仅描述符传递)

二、Netty四种零拷贝实现

2.1 CompositeByteBuf——组合多个ByteBuf

ByteBufheader=Unpooled.copiedBuffer("HTTP/1.1 200 OK\r\n".getBytes());ByteBufbody=Unpooled.copiedBuffer("Hello Netty".getBytes());CompositeByteBufcomposite=Unpooled.compositeBuffer();composite.addComponents(true,header,body);// 零拷贝!header和body的数据没有复制,只保存了引用

2.2 slice()——切片共享同一块内存

ByteBufbuf=Unpooled.buffer(1024);buf.writeBytes("Hello World".getBytes());ByteBufslice=buf.slice(0,5);// "Hello" 零拷贝!slice.setByte(0,'h');// 修改slice也影响原buf

2.3 wrap()——包裹字节数组

byte[]data="Hello".getBytes();ByteBufbuf=Unpooled.wrappedBuffer(data);// 零拷贝包裹

2.4 FileRegion——文件传输零拷贝

// 直接将文件数据DMA传输到Socket,不经过用户空间RandomAccessFilefile=newRandomAccessFile("largefile.dat","r");FileRegionregion=newDefaultFileRegion(file.getChannel(),0,file.length());ctx.writeAndFlush(region);

三、FileRegion源码

publicclassDefaultFileRegionextendsAbstractReferenceCountedimplementsFileRegion{privatefinalFileChannelfile;privatefinallongposition;privatefinallongcount;publiclongtransferTo(WritableByteChanneltarget,longpos)throwsIOException{returnfile.transferTo(this.position+pos,count-pos,target);}}// NioSocketChannel中使用protectedbooleandoWriteFileRegion(FileRegionregion){longwritten=region.transferTo(javaChannel(),region.transferred());// 底层调用:FileChannel.transferTo() → sendfile()系统调用}

四、实战:高性能文件服务器

importio.netty.bootstrap.ServerBootstrap;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.nio.NioServerSocketChannel;importio.netty.handler.codec.LineBasedFrameDecoder;importio.netty.handler.codec.string.StringDecoder;importjava.io.RandomAccessFile;publicclassZeroCopyFileServer{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupboss=newNioEventLoopGroup(1);EventLoopGroupworker=newNioEventLoopGroup();try{newServerBootstrap().group(boss,worker).channel(NioServerSocketChannel.class).childHandler(newChannelInitializer<Channel>(){protectedvoidinitChannel(Channelch){ch.pipeline().addLast(newLineBasedFrameDecoder(1024));ch.pipeline().addLast(newStringDecoder());ch.pipeline().addLast(newFileSendHandler());}}).bind(8080).sync().channel().closeFuture().sync();}finally{boss.shutdownGracefully();worker.shutdownGracefully();}}staticclassFileSendHandlerextendsChannelInboundHandlerAdapter{publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){Stringpath=((String)msg).trim();try{RandomAccessFilefile=newRandomAccessFile(path,"r");// 零拷贝发送文件!ctx.write(newDefaultFileRegion(file.getChannel(),0,file.length()));ctx.writeAndFlush("\r\n");}catch(Exceptione){ctx.close();}}}}

五、性能对比

方式CPU内存拷贝次数适用场景
传统read/write90%4次小文件
HeapBuf + write60%3次中等文件
DirectBuf + write30%2次大文件
FileRegion5%0次(DMA)超大文件

六、总结

方式原理
CompositeByteBuf多个ByteBuf零拷贝拼接
slice()同一块内存的不同视图
wrap()byte[]零拷贝包裹
FileRegionsendfile()系统调用,DMA传输

上一篇【第30篇】Netty写数据源码解析——write/flush背后的双队列设计
下一篇【第32篇】Netty背压机制——不让发送方"撑死"接收方


http://www.gsyq.cn/news/1559632.html

相关文章:

  • 巴彦淖尔市奢侈品手表包包回收门店推荐,这5家口碑店回收价格整理 - 谊识预商务
  • 少儿书画大赛线上票选怎么做?微信投票详细教程(2026优选) - 微信投票小程序
  • 2026 上海黄金回收七大门店盘点:多维度专业测评排行发布 - 奢侈品回收
  • 三分钟完成黑苹果配置:OpCore Simplify图形化工具完全指南
  • 杭州拱墅区黄金回收行情与六大正规机构2026年6月详解 - 专业黄金回收
  • 如何用5分钟打造终极音乐聚合神器?LXMusic音源完整配置指南
  • Screen Translator:三分钟掌握开源屏幕翻译的终极指南
  • Kinetis K66电气与开关特性深度解析:从数据手册到可靠硬件设计
  • 2026 上海黄金回收七大门店盘点:全场景适配品牌推荐指南 - 奢侈品回收
  • Selenium自动化测试实战:从环境搭建到CI/CD集成
  • 矩阵指数计算中的平衡技术:原理、实现与性能优化
  • Claude Opus 4.7:从问答模型到可信赖工作流协作者的跃迁
  • 2026永康黄金回收全攻略 本地靠谱商家盘点与避坑指南 - 回收测评
  • 从NEP到最小可探测量:统一量化探测器灵敏度的工程实践
  • Kinetis K22F I2S/SAI接口低功耗时序深度解析与设计实践
  • ChatGPT 5.5 不存在?拆解大模型版本幻影与真伪鉴别方法
  • 科技文献翻译实战指南:从MOOC学习到期末应试的核心策略解析
  • 安徽家长必看!升本强校合肥腾飞学校,圆孩子本科梦 - 辛云教育资讯
  • 成都锦江区黄金上门回收足不出户就选正规机构 - 专业黄金回收
  • Kimi K2.5实测:中文长文本结构化能力深度解析
  • Java+Selenium自动化测试框架搭建:从零到一构建可维护的UI测试方案
  • 邢台单招备考实录:从迷茫到上岸的真实逆袭之路 - 起跑123
  • 赤峰市2026奢侈品手表包包回收防骗指南:跑了5家店总结出的真实报价经验 - 谊识预商贸
  • 2026 哈尔滨奢二网规范回收指南,严防掉包压价和各类不合理扣费套路 - 讯息早知道
  • 如何在Photoshop中无缝集成AI绘图:SD-PPP插件完整指南
  • Java Web . Web考编论坛网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 永康金银金包银黄金回收/家庭购置的金条卖之前要注意什么? - 回收测评
  • Mac本地AI工作流搭建:OpenClaw-Mac完整安装与调优指南
  • Selenium 4.26.0 Cookie处理异常:从原理到实战的完整解决方案
  • Appium自动化测试实战:从环境部署到工程化落地的五大核心问题与解决方案