当前位置: 首页 > 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.jsqmd.com/news/1047717/

相关文章:

  • 巴彦淖尔市奢侈品手表包包回收门店推荐,这5家口碑店回收价格整理 - 谊识预商务
  • 零基础Python AI编程实战:Trae+Gitee+Ubuntu本地化开发部署
  • 自动驾驶系统开发实战指南:面向量产的工程问题诊断与解决
  • Python写的通用无人平台控制框架,支持无人艇和轮式小车,带导航、遥控、多传感器解析和UDP通信
  • 少儿书画大赛线上票选怎么做?微信投票详细教程(2026优选) - 微信投票小程序
  • MPLAB REAL ICE性能包实战:LVDS与SPI实时跟踪调试指南
  • Grok-4.3 Beta可信路径建模:让大模型推理可验证、可调控
  • 2026 上海黄金回收七大门店盘点:多维度专业测评排行发布 - 奢侈品回收
  • FLUX.2 Klein + OpenVINO™:4步秒级文生图本地部署实战
  • 常州新北区黄金回收市场简报 金价903元高位运行 - 专业黄金回收
  • 安徽合肥腾飞学校 2026 各专业学费官方公示 - 辛云教育资讯
  • 三分钟完成黑苹果配置:OpCore Simplify图形化工具完全指南
  • 黄江镇独立站SEO培训:谷歌自然流量获取实战 - 东莞选校指南
  • MC68HC908AT32 TIMB模块PWM配置详解:从原理到实战
  • 杭州拱墅区黄金回收行情与六大正规机构2026年6月详解 - 专业黄金回收
  • 2026海南GEO优化服务商权威排名:环岛电商领跑AI获客新赛道,本地企业转型必看指南 - 环岛AI智推GEO系统
  • 2026长沙积家手表回收实测|岳麓芙蓉双门店实测,正规高价无套路测评 - 薛定谔的梨花猫
  • 如何用5分钟打造终极音乐聚合神器?LXMusic音源完整配置指南
  • 2026安徽省蚌埠市中考一两百分怎么办?好就业易上手宠物护理专业最新发 - cc江江
  • MC68HC908GR16 I/O端口与中断系统配置详解及常见问题排查
  • Screen Translator:三分钟掌握开源屏幕翻译的终极指南
  • Kinetis K66电气与开关特性深度解析:从数据手册到可靠硬件设计
  • 2026南宁卖黄金别踩坑!5家回收店实地测评,内行优选清单收好 - 讯息早知道
  • 2026 上海黄金回收七大门店盘点:全场景适配品牌推荐指南 - 奢侈品回收
  • 2026 上海奢侈品回收七大门店盘点:多维度专业测评与价值评估 - 奢侈品回收
  • 南通崇川区黄金上门回收,足不出户轻松变现 - 专业黄金回收
  • 寄大件怎么省钱?2026快递比价全攻略 - 快递物流资讯
  • 白山市奢侈品回收门店红黑榜:综合实力最强的五家店铺推荐 - 谊识预商贸
  • 矩阵指数计算中的平衡技术:原理、实现与性能优化
  • Selenium自动化测试实战:从环境搭建到CI/CD集成