零拷贝的实现原理

2023-11-01

引入

Java架构直通车——Kafka介绍和高性能原因一节中,介绍了Kafka的Zero Copy技术。本文将深入探究一下Zero Copy的缘起和原理。

零拷贝,其实说的不是真的没有拷贝,文件传输必然经历从磁盘到网卡的过程,这个过程无论如何也会有拷贝的。零拷贝说的是CPU不参与到拷贝过程

在了解零拷贝之前,需要知道什么是DMA、什么是PageCache

DMA

在没有 DMA 技术前,I/O 的过程是这样的:
在这里插入图片描述
可以看到整个过程需要CPU参与搬运数据的过程,而且这个过程,CPU 是被占用的。由此可见其效率的低下。

据此,引入了DMA技术:

通过这个 DMA 控制器,CPU 只需要告诉 DMA 控制器,我们要传输什么数据,从哪里来,到哪里去,就可以放心离开了。后续的实际数据传输工作,都会由 DMA 控制器来完成CPU 不需要参与数据传输的工作

在这里插入图片描述
从上面的图可以看出,磁盘到内存缓冲区是由DMA来拷贝完成的,而CPU只需要完成从内核态缓冲区到用户态缓冲区数据的拷贝,用图来表示是这样的:
在这里插入图片描述
将磁盘上的文件读取出来,然后通过网络协议发送给客户端,这个过程就如上图所示,代码通常如下,一般会需要两个系统调用:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

这个过程中,共发生了 4 次用户态与内核态的上下文切换,因为发生了两次系统调用, 一次是 read() ,一次是 write() ,每次系统调用都得先从用户态切换到内核态,等内核完成任务后,再从内核态切换回用户态。其次,还发生了 4 次数据拷贝,其中两次是 DMA 的拷贝,另外两次则是通过 CPU 拷贝的。

上下文切换到成本并不小,一次切换需要耗时几十纳秒到几微秒,虽然时间看上去很短,但是在高并发的场景下,这类时间容易被累积和放大,从而影响系统的性能。

所以,要想提高文件传输的性能,就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数。

PageCache

回顾前面说道文件传输过程,其中第一步都是先需要先把磁盘文件数据拷贝「内核缓冲区」里,这个「内核缓冲区」实际上是磁盘高速缓存(PageCache)

零拷贝使用了 PageCache 技术,可以使得零拷贝进一步提升了性能。

PageCache是根据程序的局部性原理来设计的, PageCache 缓存最近被访问的数据,当空间不足时淘汰最久未被访问的缓存。

另外,读取磁盘数据的时候,需要找到数据所在的位置,但是对于机械磁盘来说,就是通过磁头旋转到数据所在的扇区,再开始「顺序」读取数据,但是旋转磁头这个物理动作是非常耗时的,为了降低它的影响,PageCache 使用了「预读功能」

比如,假设 read 方法每次只会读 32 KB 的字节,虽然 read 刚开始只会读 0 ~ 32 KB 的字节,但内核会把其后面的 32~64 KB 也读取到 PageCache,这样后面读取 32~64 KB 的成本就很低,如果在 32~64 KB 淘汰出 PageCache 前,进程读取到它了,收益就非常大。

PageCache 的优点主要是两个:

  • 缓存最近被访问的数据;
  • 预读功能;

零拷贝

零拷贝技术实现的方式通常有 2 种:

  • mmap + write
  • sendfile

下面就谈一谈,它们是如何减少「上下文切换」和「数据拷贝」的次数。

mmap

mmap()系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。
在这里插入图片描述
我们可以看到这只减少了一次拷贝,仍然需要 4 次上下文切换。

sendfile

sendfile()可以替代前面的 read() 和 write() 这两个系统调用,这样就可以减少一次系统调用,也就减少了 2 次上下文切换的开销。

在这里插入图片描述
sendfile()也就减少了 2 次上下文切换的开销,减少了1次拷贝。

SG-DMA

但是上述拷贝还不是真正的零拷贝技术,如果网卡支持 SG-DMA(The Scatter-Gather Direct Memory Access)技术(和普通的 DMA 有所不同),我们可以进一步减少通过 CPU 把内核缓冲区里的数据拷贝到 socket 缓冲区的过程。

在这里插入图片描述
这就是所谓的零拷贝(Zero-copy)技术,因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据所有的数据都是通过 DMA 来进行传输的

零拷贝技术的文件传输方式相比传统文件传输的方式,减少了 2 次上下文切换和数据拷贝次数,只需要 2 次上下文切换和数据拷贝次数,就可以完成文件的传输,而且 2 次的数据拷贝过程,都不需要通过 CPU,2 次都是由 DMA 来搬运。

使用零拷贝技术的项目

如果你追溯 Kafka 文件传输的代码,你会发现,最终它调用了 Java NIO 库里的 transferTo 方法:

@Overridepublic 
long transferFrom(FileChannel fileChannel, long position, long count) throws IOException { 
    return fileChannel.transferTo(position, count, socketChannel);
}

如果 Linux 系统支持 sendfile() 系统调用,那么 transferTo() 实际上最后就会使用到 sendfile() 系统调用函数。


另外,Nginx 也支持零拷贝技术,一般默认是开启零拷贝技术,这样有利于提高文件传输的效率,是否开启零拷贝技术的配置如下:

http {
...
    sendfile on
...
}

sendfile 配置的具体意思:
设置为 on 表示,使用零拷贝技术来传输文件:sendfile ,这样只需要 2 次上下文切换,和 2 次数据拷贝。
设置为 off 表示,使用传统的文件传输技术:read + write,这时就需要 4 次上下文切换,和 4 次数据拷贝。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

零拷贝的实现原理 的相关文章

  • 面试准备

    首行占位 Python相关 1 Python3特性和变化 1 Python3默认编码是UTF 8 xff0c 2为ASCII 2 Python3中只有int xff0c 2中有int跟long xff0c 其中int不能超过sys maxi
  • Java并发编程实战——彻底理解volatile

    文章目录 volatile作用 volatile实现原理 volatile的happens before关系 volatile的内存语义 volatile重排序与JMM内存屏障 volatile的使用误区 volatile的适用场景 vol
  • 面试准备:Mybatis常见面试题汇总

    文章目录 1 和 的区别是什么 2 当实体类中的属性名和表中的字段名不一样 怎么办 3 模糊查询like语句该怎么写 4 Mybatis 一对一 一对多的xml怎么写 5 Dao 接口的工作原理是什么 Dao 接口里的方法 参数不同时 方法
  • 面试总结:测试常见面试题汇总

    文章目录 理论 测试流程 各个测试阶段 单元测试 集成测试 系统测试区别 测试用例设计 什么是好的测试用例 方法 用户登录 实例 App测试和Web测试的区别 典型测试场景 聊天功能测试用例怎么设计 怎么测试微信朋友圈 TODO 怎么测试微
  • 零拷贝的实现原理

    文章目录 引入 DMA PageCache 零拷贝 mmap sendfile SG DMA 使用零拷贝技术的项目 引入 在Java架构直通车 Kafka介绍和高性能原因一节中 介绍了Kafka的Zero Copy技术 本文将深入探究一下Z
  • 面试准备:Java新特性详解

    文章目录 Java语言新特性 1 Lambda表达式和函数式接口 2 接口的默认方法和静态方法 3 方法引用 4 重复注解 5 更好的类型推断 6 拓宽注解的应用场景 Java编译器新特性 参数名称 JVM的新特性 更多资料 参考 java
  • 面试准备:Java常见面试题汇总(一)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 1 面向对象的特点 特性有哪些 补充 Java的多态是编译时多态还是运行时多态 2 接口和抽象类的相同点和不同点 3
  • 面试题目总结(CNN)

    CNN权值共享是什么 局部感知 即网络部分连通 每个神经元只与上一层的部分神经元相连 只感知局部 而不是整幅图像 滑窗实现 可行性 局部像素关系紧密 较远像素相关性弱 因此只需要局部感知 在更高层将局部的信息综合起来就得到了全局的信息 权值
  • 面试准备:Java常见面试题汇总(二)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 43 java 中的 Math round 1 5 等于多少 44 String str abc 与 String
  • 处理器对原子操作的实现

    文章目录 引入 单核 多核 引入 原子操作对于我们来说 是非常熟悉的概念 从用户角度 可以用原子操作来替换重量级的锁同步 从而提高程序性能 底层实现角度 原子操作可以用于构建各种更重量级的同步操作 比如锁或屏障之类的 对于原子操作的实现来说
  • Java架构直通车——Java基础面试考点清单

    文章目录 基础 J U C jvm虚拟机 数据结构 算法 Spring RPC通信框架 网络通信 MQ 缓存 Mybatis 其他技术 基础 强引用 弱引用 虚引用 软引用 final关键字的作用 方法 变量 类 泛型 泛型继承 泛型擦除
  • Java架构直通车——深入理解B+树

    文章目录 引入 AVL树和B树 AVL树 红黑树 B树 B 树 数据库为什么不使用二叉树 为什么使用B 树 与B树的区别 引入 AVL树和B树 AVL树 平衡二叉搜索树是基于二分法的策略提高数据的查找速度的二叉树的数据结构 平衡二叉搜索树的
  • 从头开始学Java——JVM虚拟机八问

    文章目录 什么是Java虚拟机 为什么Java被称为 平台无关的编程语言 什么是JIT HotSpot怎么工作的 HotSpot虚拟机要使用解释器与编译器并存的架构 什么是编译时 运行时 编译 运行 编译时运行时问题归纳 反射 描述Java
  • 招银网络科技电话面试

    1 关于项目的负责内容 还是非常有必要熟悉应急 天基的基础传输模块的 基本面试中都会觉得只界面模块很单薄 应急 基础传输模块 无人机网络协议 速率控制模块 界面模块 天基 基础传输模块 MRUDP 界面模块 2 TCP长连接 问 如何在TC
  • Java中数字的应用

    Java中数字的应用 在java中经常会遇到比较大的数 甚至超过了long型 那么该如何处理这些 大数据 呢 在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类 从原则上是可以表示 天文单位 一样大的
  • 测开面经总结的经常考察的知识点

    一 算法相关 1 熟悉常见的排序算法 冒泡排序 插入排序 选择排序 归并排序 堆排序 快排 希尔排序 二 计算机网络相关 1 http协议 http 超文本传输协议 是一个在客户端和服务器端之间基于请求与响应模式的 无状态的 应用层的协议
  • 【动态规划】最长公共子序列和最长公共子串(python)

    编写用时 2020年3月12日12 02 28 1h 动态规划经典例题 最长公共子序列和最长公共子串 python 很久之前大概是高中的时候写过这种题目 使用动态规划的方法求解的 现读研究生了 要把过去的拾起来的呢 1 最长公共子序列 LC
  • 面试准备:MySQL建立索引的原则

    文章目录 建立索引 1 和in可以乱序 2 最左前缀匹配原则 3 尽量选择区分度高的列作为索引 4 索引列不能参与计算 5 尽量的扩展索引 不要新建索引 6 为经常需要排序 分组和联合操作的字段建立索引 7 为常作为查询条件的字段建立索引
  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用
  • Linux内核内存管理算法Buddy和Slab

    文章目录 Buddy分配器 CMA Slab分配器 总结 Buddy分配器 假设这是一段连续的页框 阴影部分表示已经被使用的页框 现在需要申请一个连续的5个页框 这个时候 在这段内存上不能找到连续的5个空闲的页框 就会去另一段内存上去寻找5

随机推荐

  • 计算机基础win7桌面操作,计算机基础1实验报告win7基本操作.doc

    WORD格式 分享 PAGE 精品 资料 大学计算机基础 课程 实验报告 学院 年级 专业 姓名 学号 任课教师 上机地点 实验教师 以上由学生填写 西南大学计算机与信息科学学院 计算机基础教育系 2015年10 月18 日 实验成绩记载
  • 蓝桥杯——算法训练——最小距离

    问题描述 数轴上有n个数字 求最近的两个数 即min abs x y 输入格式 第一行包含一个整数n 接下来一行 表示n整数 输出格式 一个整数表示最小距离 样例输入 6 7 3 4 11 9 17 样例输出 1 样例说明 取3和4 数据规
  • 华为OD机试 - 分积木(Java)

    题目描述 Solo和koko是两兄弟 妈妈给了他们一大堆积木 每块积木上都有自己的重量 现在他们想要将这些积木分成两堆 哥哥Solo负责分配 弟弟koko要求两个人获得的积木总重量 相等 根据Koko的逻辑 个数可以不同 不然就会哭 但ko
  • HSQLDB简介

    HyperSQL数据库 HSQLDB 是现代的关系数据库系统 版本2 5 1是全新版本2代码的最新版本 HyperSQL 2 5版与Java 8或更高版本兼容 HyperSQL用于开发 测试和部署数据库应用程序 SQL标准合规性是Hyper
  • winform开发框架常见的分层模式

    winform开发框架 基础的分层模式 可以分为UI层 User Interface BLL层 Business Logic Layer 业务逻辑层 DAL层 Data Access Layer 数据访问层 业务逻辑层 Business L
  • Java的异常入门

    概念 异常就是程序出现了不正常的情况 会导致JVM非正常停止 语法错误不算异常体系中 异常体系 编译时异常 运行时异常 虚拟机默认处理方式 代码中出现异常 程序会先判断有没有处理异常的代码 如果没有就会让调用者 虚拟机 处理 如果有就会走处
  • 各个公司面试汇总及规划(不再进入GIS行业)

    面试了几个大公司 均没过 但是值得骄傲的是 有大公司主动找我的简历后面试了 以前理都不理 值得庆贺 幸亏以前有个Offer UE4 C 25k税前 最低社保最低五险一金 相当于拿到手20K 其余的啥也没有 说一下几个公司的特点 主要是找不足
  • Swin-Transformer分类源码(已跑通colab)

    以下是本文参考的博客 大家有需要可以参考一下 1 Swin Transformer分割源码 已跑通 2 Swin Transformer分类源码 已跑通 3 swin transformer理解要点 一 概要 最近swin transfor
  • nginx 添加http header头,进行跨域设置(“add_header“ directive is not allowed)

    有时候我们想对某个项目进行跨域访问限制 不管是静态目录文件 还是其他 动态文件还好说 可以在代码里添加 如php header Access Control Allow Origin http www a com header Access
  • 基于MeSC与交感神经作用关系的压力水平与白发模拟系统和压力规划系统(更新中)

    基于MeSC与交感神经作用关系的压力水平与白发模拟系统和压力规划系统 一个本人的Matlab项目 可用于根据压力水平模拟白发水平 并根据工作情况给出白发量最少的合理的压力规划 这是本学期 数值计算方法 我做的一个期末大作业 模型还未完全更新
  • 方差分析anova

    方差分析 参考 http wiki mbalib com wiki E6 96 B9 E5 B7 AE E5 88 86 E6 9E 90 方差分析 Analysis of Variance 简称ANOVA 什么是方差分析 方差分析 ANO
  • 【Python八股文系列】:100个Python的面试/笔试高频考点

    Python的100个面试 笔试高频考点 本文主要整理了关于Python的面试 笔试的一些考点 可用于查漏补缺 涉及到的一些Python进阶知识 可以查看专栏学习 Python进阶 quad quad 1 解释型和编译型语言的区别 编译型语
  • 调用接口登录禅道_java调用api接口

    api 可以admin登录禅道 看下后台 二次开发 api 可以看下手册 http devel cnezsoft com book extension api intro 43 html http devel cnezsoft com bo
  • SVN使用教程

    摘自 SVN使用教程 地址 https www bilibili com video BV1k4411m7mP from search seid 1516107384812084869 spm id from 333 337 0 0 摘自
  • 笨办法学python 习题29

    习题29 在atom中的代码 people 20 cats 30 dogs 15 if people lt cats print too much cats if people gt cats print not many cats if
  • perl内置的DATA文件句柄

    当前 个人使用 最常见的perl脚本应用场景是针对文本的操作 编写perl脚本的时候 经常要手动创建一个待处理的文本 其实 perl内置了一个DATA文件句柄 就是为了perl脚本测试用的 mark 记录一下 usr local bin p
  • 使用IntelliJ IDEA 15和Maven创建Java Web项目

    1 Maven简介 相对于传统的项目 Maven 下管理和构建的项目真的非常好用和简单 所以这里也强调下 尽量使用此类工具进行项目构建 它可以管理项目的整个生命周期 可以通过其命令做所有相关的工作 其常用命令如下 mvn compile m
  • 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)

    阅读目录 一 什么是SourceMap 二 理解webpack中的SourceMap的eval inline sourceMap cheap module 三 开发环境和线上环境如何选择sourceMap 回到顶部 一 什么是SourceM
  • 【vue】vue2.5的使用

    简单的vue实例包含一个index html主页文件 一个vue js框架文件 一 标签数据绑定 引用实例中data数据 1 插值表达式 div msg div 2 v text data中属性名 div div 3 v html data
  • 零拷贝的实现原理

    文章目录 引入 DMA PageCache 零拷贝 mmap sendfile SG DMA 使用零拷贝技术的项目 引入 在Java架构直通车 Kafka介绍和高性能原因一节中 介绍了Kafka的Zero Copy技术 本文将深入探究一下Z