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

Netty——零拷贝

文章目录

  • 1. 什么是零拷贝?
  • 2. 为什么需要零拷贝?
    • 2.1 传统 I/O 的拷贝流程
    • 2.2 零拷贝的优化
      • 2.2.1 通过 sendfile 系统调用
      • 2.2.2 通过 mmap (内存映射) 系统调用
  • 3. Netty 实现零拷贝的方式
    • 3.1 文件传输优化:FileRegion 封装
    • 3.2 直接内存 (Direct Memory)
    • 3.3 内存映射文件:MappedByteBuffer
    • 3.4 复合缓冲区:CompositeByteBuf
    • 3.5 切片与包装操作
  • 4. 零拷贝的优点
  • 5. 总结


1. 什么是零拷贝?

零拷贝 (Zero-Copy) 是一种 通过减少或避免数据在内存之间不必要的拷贝,从而提升系统性能的技术。它主要用于 操作系统内核用户程序 之间的数据传输场景。

2. 为什么需要零拷贝?

2.1 传统 I/O 的拷贝流程

以文件传输为例,传统 I/O 的拷贝流程如下所示:

  1. 从 磁盘 读取数据到 内核缓冲区:数据从磁盘通过 DMA(直接内存访问)传输到内核空间的缓冲区。
    从 磁盘 读取数据到 内核缓冲区
  2. 将数据从 内核缓冲区 拷贝到 用户空间:用户程序通过系统调用(如 read())将内核缓冲区的数据拷贝到用户空间的缓冲区。
    将数据从 内核缓冲区 拷贝到 用户空间
  3. 将数据从 用户空间 拷贝回 内核 Socket 缓冲区:用户程序通过系统调用(如 write())将数据从用户空间缓冲区拷贝到内核空间的 Socket 缓冲区。
    将数据从 用户空间 拷贝回 内核 Socket 缓冲区
  4. 将数据从 内核 Socket 缓冲区 发送到 网络:数据通过 DMA 传输到网卡,完成发送。
    将数据从 内核 Socket 缓冲区 发送到 网络

问题:传统流程需要 4 次拷贝2 次上下文切换(用户态 和 内核态 的相互切换),性能开销大。

2.2 零拷贝的优化

零拷贝主要通过 减少用户空间与内核空间的交互 的方式减少拷贝次数,具体可以使用的特性如下:

2.2.1 通过 sendfile 系统调用

通过 sendfile,直接在内核空间将文件数据传输到 Socket 缓冲区,避免了 2 次上下文切换和 1 次拷贝。步骤如下:

磁盘->内核缓冲区
文件缓冲区->Socket 缓冲区
内核->网络

注:第二步文件从内核的 文件缓冲区 拷贝到 Socket 缓冲区 使用的是 DMA 还是 CPU 拷贝需要看硬件是否支持 SG-DMA(分散聚合直接内存访问)。

  • 若硬件(如网卡)支持 SG-DMA,数据从 文件缓冲区 到 Socket 缓冲区 的传输由 DMA 完成,无需 CPU 参与拷贝。此时,内核只需告知 DMA 控制器数据位置和长度,DMA 直接在内核空间内搬运数据,完全释放 CPU 资源,实现更高效的零拷贝
  • 若硬件不支持 SG-DMA,内核会通过 CPU 拷贝将数据从 文件缓冲区 复制到 Socket 缓冲区。

2.2.2 通过 mmap (内存映射) 系统调用

mmap 系统调用会将文件映射到进程的虚拟地址空间,使得进程可以直接访问文件内容,而无需将文件内容拷贝到用户空间的缓冲区。过程如下:

  1. 映射文件到虚拟地址空间:应用程序调用 mmap,操作系统会创建一个虚拟内存区域,并将其与文件的物理地址进行映射。此时,文件内容并没有被实际加载到内存中,只是建立了映射关系。
    映射文件到虚拟地址空间
  2. 直接访问映射区域:应用程序可以像访问普通内存一样直接访问映射区域。当应用程序访问映射区域中的某个地址时,如果该地址对应的页面尚未加载到内存中,会触发 缺页中断。操作系统会根据映射关系,将文件中的相应数据从 磁盘 读取到 内核空间的文件缓冲区,并将该页面映射到进程的虚拟地址空间。
    直接访问映射区域
  3. 将数据从 文件缓冲区 发送到到 Socket 缓冲区:当需要将文件内容发送到网络时,应用程序可以直接操作映射区域。操作系统会将内核空间的 文件缓冲区 中的数据直接拷贝到 Socket 缓冲区
    将数据从 文件缓冲区 发送到到 Socket 缓冲区
  4. 将数据从 Socket 缓冲区 发送到 网络:将数据从 Socket 缓冲区 发送到 网卡
    将数据从 Socket 缓冲区 发送到 网络

在这个过程中,数据不需要经过用户空间的缓冲区,避免了 1 次数据拷贝

注意:看似 用户空间 中好像有也一块内存,与 文件缓冲区 一样,但其实 用户空间 用 页表 来映射 文件缓冲区 中内存。

3. Netty 实现零拷贝的方式

3.1 文件传输优化:FileRegion 封装

Netty 通过 FileRegion 类封装了 NIO 的 FileChannel 类的 transferTo() 方法,避免数据 在 内核空间 与 用户空间 的拷贝上下文切换。在 Linux 操作系统中,transferTo() 底层使用 sendfile 的系统调用实现 零拷贝

3.2 直接内存 (Direct Memory)

Netty 使用 直接内存 (Direct Memory) 来减少数据在 用户空间 和 内核空间 之间的拷贝。直接内存由操作系统直接管理,避免了在 用户空间 的中转。

  • 对于文件操作,使用 mmap 进行优化。
  • 对于网络传输,使用 sendfile 进行优化。

从而避免将内核空间中 文件缓冲区 的数据拷贝到 用户空间 和 2 次上下文切换。

3.3 内存映射文件:MappedByteBuffer

通过 FileChannel.map() 将文件映射到虚拟内存,直接通过内存地址操作文件数据。底层使用了 mmap 技术,避免了 内核空间 与 用户空间 之间的 数据拷贝 和 线程切换。

3.4 复合缓冲区:CompositeByteBuf

CompositeByteBuf 将多个 ByteBuf 组合成一个逻辑上的整体,无需物理合并数据,减少内存复制

3.5 切片与包装操作

通过 ByteBuf 对象的 slice()duplicate()Unpooled.wrappedBuffer() 共享数据,而非复制数据,使用这些方法生成的 ByteBuf 与原始 ByteBuf 共用底层内存数据。

ByteBuf 除了 slice()duplicate() 方法之外,还有 retainedSlice()retainedDuplicate() 方法,这两个方法也可以实现零拷贝,而且还 增加了引用计数,避免在原始 ByteBuf 释放时意外释放共享的内存,所以更推荐调用这两个方法。

4. 零拷贝的优点

  • 降低 CPU 利用率,减少内存带宽消耗
  • 提升 I/O 密集型任务的性能

5. 总结

零拷贝并非一次拷贝都没有,它指的是尽量减少拷贝的数量,从而提升程序的性能。可优化的地方在于避免 数据在 内核空间 和 用户空间 的拷贝内核态 与 用户态 之间的上下文切换,在操作系统层面使用 sendfilemmap 就可以做到。在 Netty 中,实现零拷贝的方式有很多种,可以通过以下方式:

  • FileRegion 对象的 transfterTo() 方法
  • 直接内存
  • MappedByteBuffer
  • CompositeByteBuf
  • 切片和包装

相关文章:

Netty——零拷贝

文章目录 1. 什么是零拷贝?2. 为什么需要零拷贝?2.1 传统 I/O 的拷贝流程2.2 零拷贝的优化2.2.1 通过 sendfile 系统调用2.2.2 通过 mmap (内存映射) 系统调用 3. Netty 实现零拷贝的方式3.1 文件传输优化:FileRegion 封装3.2 直接内存 (Dire…...

Java制作简单的聊天室(复习)

设计的知识点:几乎包含java基础的全部知识点(java基础语法,java基础进阶:双列集合,io流,多线程,网络编程等) 代码如下 客户端: 服务器采用的时多线程的循环多线程的方式…...

ES 字段的映射定义了字段的类型及其行为

在 Elasticsearch 中,字段的映射定义了字段的类型及其行为。你提供的 content_answer 字段映射如下: Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …...

Android开发点击字符串web链接跳到系统浏览器上

Android开发点击字符串web链接跳到系统浏览器上 直接上代码:用到你就拿去用 public static void performItemUrlClick(View view, String contentUrl) {if (!TextUtils.isEmpty(contentUrl)) {Intent intent new Intent();if (!contentUrl.startsWith("http…...

运维规则之总结(Summary of Operation and Maintenance Rules)

运维规则之总结 在运维领域,经验和流程往往决定了系统的稳定性与可靠性。一个运维人,总结出了以下10条运维规则,涵盖了从基础管理到高级策略的全面内容,旨在帮助运维人员更好地应对各种挑战,确保系统的平稳运行。 1.…...

智能家居赋能宠物经济:未来宠物行业的另一片蓝海

一、引言:宠物经济的范式转移 随着城市化进程的加速,宠物在现代家庭中的地位日益重要,宠物经济蓬勃发展。近年来,智能家居技术的兴起为宠物行业带来了新的变革,从传统的情感消费模式向技术赋能的精细化养宠模式转变。…...

C++Primer学习(13.6 对象移动)

13.6 对象移动 新标准的一个最主要的特性是可以移动而非拷贝对象的能力。如我们在13.1.1节(第440页)中所见,很多情况下都会发生对象拷贝。在其中某些情况下,对象拷贝后就立即被销毁了。在这些情况下,移动而非拷贝对象会大幅度提升性能。 如我…...

RHCE工程师特训指南

RHCE(红帽认证工程师)是Linux领域极具含金量的认证之一,其考试以实操为主,注重系统管理、网络服务配置及自动化运维能力。以下内容可帮助对RHCE考生高效规划学习路径。 一、RHCE认证概述 认证结构 RHCE认证分为两部分&#xff…...

内核、进程和线程---操作系统

操作系统 操作系统位于用户程序和硬件之间,通过系统调用提供接口可以让应用程序去使用硬件,但是硬件资源的管理和安全控制由操作系统负责。 用户空间和内存空间 在计算机系统中,内存可以分为两大区域:内核空间(Ker…...

如何在 Postman 中上传图片并在请求中正确引用?

Postman 是一款常用的 API 测试工具,它不仅可以测试 API 的请求和响应,还支持多种数据格式包括图片。如何在 Postman 中传输图片? Postman 如何上传图片并在请求中使用教程...

平板实现 adb connect 连接的步骤

1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...

安全+低碳+高效:Acrel-3000助力企业打造未来型电能管理体系-安科瑞黄安南

一 背景 电能因为方便传输、易于转换、便于控制等特性,成为广大企事业单位生产、办公最主要的能量来源。双碳背景下,由于电能清洁、高效、零排放的特点,能源消费侧将逐步以电代煤、以电代油、以电代气,形成以电为中心的能源消费体…...

专注自习室:番茄工作法实践

专注自习室:番茄工作法实践 我需要一个任务管理工具,但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性,给我带来了很强的心理压力,这种压力最终反而降低了我的工作效率。于是我决定自己动手&#xff0…...

docker save如何迁移镜像更节省空间?

文章目录 方法一:使用docker save命令方法二:直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间?空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移&…...

LeetCode算法题(Go语言实现)_16

题目 给定一个二进制数组 nums 和一个整数 k&#xff0c;假设最多可以翻转 k 个 0 &#xff0c;则返回执行操作后 数组中连续 1 的最大个数 。 一、代码实现 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …...

CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案

计算机该如何求解三角函数&#xff1f;或许你的第一印象是采用泰勒展开&#xff0c;或者采用多项式进行逼近。对于前者&#xff0c;来回的迭代计算开销成本很大&#xff1b;对于后者&#xff0c;多项式式逼近在较窄的范围內比较接近&#xff0c;超过一定范围后&#xff0c;就变…...

JVM 面经

1、什么是 JVM? JVM 就是 Java 虚拟机&#xff0c;它是 Java 实现跨平台的基石。程序运行之前&#xff0c;需要先通过编译器将 Java 源代码文件编译成 Java 字节码文件&#xff1b;程序运行时&#xff0c;JVM 会对字节码文件进行逐行解释&#xff0c;翻译成机器码指令&#x…...

SEO(搜索引擎优化)详解

SEO&#xff08;搜索引擎优化&#xff09;详解 SEO是Search Engine Optimization的缩写&#xff0c;中文称为"搜索引擎优化"。它是指通过一系列技术和方法&#xff0c;提高网站在搜索引擎自然&#xff08;非付费&#xff09;搜索结果中的排名&#xff0c;从而获得更…...

Ubuntu平台下安装Node相关环境

说明&#xff1a;在进行VUE、TS等开发需要用到NodeJS相关环境&#xff0c;不同的项目有时候需要不同的Node版本支撑。本文将详细讲解NVM、Node、Yarn、PM2等环境安装的实施步骤。 测试服务器环境&#xff1a;22.04 LTS。 1. NVM 定义&#xff1a;Node Version Manager&#x…...

deepseek大模型一体机与deepseek的关系

deepseek大模型一体机与deepseek的关系 一、deepseek大模型一体机是什么 DeepSeek大模型一体机是由深度求索&#xff08;DeepSeek&#xff09;公司推出的软硬件一体化AI解决方案&#xff0c;旨在为企业提供高效、便捷的大模型部署和应用能力。 二、deepseek大模型一体机与de…...

Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站

开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组&#xff0c;开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App&#xff0c;登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…...

高等数学-第七版-上册 选做记录 习题7-2

1. 2....

基于Promise链式调用的多层级请求性能优化

代码优化-循环嵌套关联请求 1. 背景 在实际开发中&#xff0c;我们经常会遇到需要嵌套关联请求的场景&#xff0c;比如&#xff1a; 获取项目列表获取项目详情获取项目进度 2. 问题 在这种场景下&#xff0c;我们可能会遇到以下问题&#xff1a; 串行请求瀑布流&#xff…...

【强化学习】基于深度强化学习的微能源网能量管理与优化策略研究【Python】

目录 主要内容 程序要点 2.1 微能源网系统组成 2.2 强化学习及Q学习算法 部分代码 运行结果 下载链接 主要内容 该程序借助深度 Q 网络&#xff08;DQN&#xff09;&#xff0c;学习预测负荷、风 / 光可再生能源功率输出及分时电价等环境信息&#xff0c;运用…...

楼宇自控借何种技术,驱动建筑迈向高效绿色

在全球积极倡导可持续发展的大背景下&#xff0c;建筑行业作为能源消耗和碳排放的大户&#xff0c;实现高效绿色发展迫在眉睫。楼宇自控系统凭借其先进的技术手段&#xff0c;成为推动建筑向高效绿色转型的关键力量。那么&#xff0c;楼宇自控究竟借助哪些技术&#xff0c;让建…...

监控易一体化运维:监控易机房管理,打造高效智能机房

在数字化浪潮中&#xff0c;企业对数据中心和机房的依赖程度与日俱增&#xff0c;机房的稳定运行成为业务持续开展的关键支撑。信息化的变迁&#xff0c;见证了机房管理从传统模式向智能化、精细化转变的过程。今天&#xff0c;就为大家深度剖析监控易在机房管理方面的卓越表现…...

简记_FPGA 硬件最小系统设计

一、FPGA板级设计的五要素 1.1、电源电路 核心电压&#xff1a;一般为固定值 IO电压&#xff1a;FPGA的IO分为多个bank&#xff0c;同一个bank的不同IO引脚电压相同&#xff0c;不同bank的电压可以不同 辅助电压&#xff1a;除了核心电压和IO电压&#xff0c;FPGA工作所需的…...

1.1-站点差异\源码差异\数据存储差异\MVC模型

1、有哪几种站点 分主站、分站、端口站、子站、目录站 2、有哪几种源码语言框架差异 开源-如Zblog 闭源-内部开发 加密-如通达OA 3、网站数据存储有哪几个方式 本地数据库&#xff1a;本地服务器搭建 分离数据库&#xff1a;另外的服务器搭建 云数据库&#xff1a;RDS…...

PHP安装HTML转图片的扩展GD库的使用

修改你的PHP.ini文件,找到以下位置 ;extensionphp_gd2.dll 把前面的;去掉…...

清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法

导 读INTRODUCTION 今天跟大家分享的是清华大学新闻与传播学院、人工智能学院双聘教授沈阳教授团队出品的《迈向未来的AI教学实验》课程作业集&#xff0c;随着人工智能技术的飞速发展&#xff0c;教育领域也迎来了前所未有的变革。该报告为沈阳教授与学生们在“迈向未来的AI教…...