首页/新闻资讯/正文详情

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

发布时间:2026/9/24 23:08:56 来源:云帆数科 栏目:资讯中心
【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 零拷贝sendfile2次拷贝0次上下文切换 磁盘→内核缓冲区→Socket缓冲区→网卡 ↑ DMA ↑ DMA(仅描述符传递)二、Netty四种零拷贝实现2.1 CompositeByteBuf——组合多个ByteBufByteBufheaderUnpooled.copiedBuffer(HTTP/1.1 200 OK\r\n.getBytes());ByteBufbodyUnpooled.copiedBuffer(Hello Netty.getBytes());CompositeByteBufcompositeUnpooled.compositeBuffer();composite.addComponents(true,header,body);// 零拷贝header和body的数据没有复制只保存了引用2.2 slice()——切片共享同一块内存ByteBufbufUnpooled.buffer(1024);buf.writeBytes(Hello World.getBytes());ByteBufslicebuf.slice(0,5);// Hello 零拷贝slice.setByte(0,h);// 修改slice也影响原buf2.3 wrap()——包裹字节数组byte[]dataHello.getBytes();ByteBufbufUnpooled.wrappedBuffer(data);// 零拷贝包裹2.4 FileRegion——文件传输零拷贝// 直接将文件数据DMA传输到Socket不经过用户空间RandomAccessFilefilenewRandomAccessFile(largefile.dat,r);FileRegionregionnewDefaultFileRegion(file.getChannel(),0,file.length());ctx.writeAndFlush(region);三、FileRegion源码publicclassDefaultFileRegionextendsAbstractReferenceCountedimplementsFileRegion{privatefinalFileChannelfile;privatefinallongposition;privatefinallongcount;publiclongtransferTo(WritableByteChanneltarget,longpos)throwsIOException{returnfile.transferTo(this.positionpos,count-pos,target);}}// NioSocketChannel中使用protectedbooleandoWriteFileRegion(FileRegionregion){longwrittenregion.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{EventLoopGroupbossnewNioEventLoopGroup(1);EventLoopGroupworkernewNioEventLoopGroup();try{newServerBootstrap().group(boss,worker).channel(NioServerSocketChannel.class).childHandler(newChannelInitializerChannel(){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{RandomAccessFilefilenewRandomAccessFile(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背压机制——不让发送方撑死接收方

相关推荐

React 状态更新陷阱及解决方案
React 状态更新陷阱及解决方案

在使用 React 开发应用时,处理用户输入并更新状态是一个常见的任务。然而,在这个过程中,如果不注意细节,可能会遇到一些意想不到的错误。今天我们来探讨一个典型的例子,分析问题原因并提供解决方案。 问题描述 假设我们有一个简单的 React 组件,允许用户在一个输入框中… · 2026/9/24 13:59:14

三分钟完成黑苹果配置:OpCore Simplify图形化工具完全指南
三分钟完成黑苹果配置:OpCore Simplify图形化工具完全指南

三分钟完成黑苹果配置:OpCore Simplify图形化工具完全指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore配置而烦恼… · 2026/9/24 13:50:22

FLUX.2 Klein + OpenVINO™:4步秒级文生图本地部署实战
FLUX.2 Klein + OpenVINO™:4步秒级文生图本地部署实战

1. 项目概述:为什么“秒级生图”不再是云端专属的幻觉你有没有过这种体验:在本地笔记本上跑一个文生图模型,点下生成按钮后,盯着进度条数到第17秒,心里默念“再忍忍,马上就好”,结果第23秒才出第… · 2026/9/15 0:00:30

MCP 2026 路线图深度解析:四大优先领域、SEP 评审优先级与社区参与指南
MCP 2026 路线图深度解析:四大优先领域、SEP 评审优先级与社区参与指南

人工智能AI Agent工具调用 【免费下载链接】specification Specification and documentation for the Model Context Protocol 项目地址: https://gitcode.com/gh_mirrors/specification2/specification 点击查看 免费下载 2026 年 3 月,Model Context … · 2026/9/25 1:26:40

VS Code插件这样配 TaoToken,settings.json 骨架一次到位
VS Code插件这样配 TaoToken,settings.json 骨架一次到位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:26:40

洗碗机水泵EMC高集成整改方案:四维协同降噪
洗碗机水泵EMC高集成整改方案:四维协同降噪

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:26:40

C++三角函数实战指南:从弧度转换到游戏开发中的sin、cos、atan2应用
C++三角函数实战指南:从弧度转换到游戏开发中的sin、cos、atan2应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:26:34

LabVIEW 集成 libssh2:工控上位机安全 SSH 远程运维实战
LabVIEW 集成 libssh2:工控上位机安全 SSH 远程运维实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:26:34

ZDT_X系列V2步进闭环驱动说明书Rev1.0:硬件配置、参数调试与通信协议详解
ZDT_X系列V2步进闭环驱动说明书Rev1.0:硬件配置、参数调试与通信协议详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:26:34

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码