Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

2023-11-19

详细介绍了两种zero-copy零拷贝技术mmap和sendfile的概念和基本原理。

目录

1 标准IO

2 零拷贝

2.1 sendfile调用

2.1 mmap调用

2.2 MQ中的应用


1 标准IO

很多软件是基于server-client模式的,最常见的下载功能需要从Server端的磁盘中将文件通过网络发送到客户端中去。如果采用传统标准IO的方式(基于数据拷贝),那么需要如下步骤。

 传统标准IO通过网络传输数据,需要进行如下调用:

buffer = File.read 
Socket.send(buffer)

总共需要四步:

1. read(): 涉及到两次上下文切换以及两次数据拷贝;

        1.1 读取磁盘文件,将数据DMA Copy到操作系统内核缓冲区Page Cache;

        1.2 将内核缓冲区Page Cache的数据,CPU Copy到应用程序缓存;

2. send(): 涉及到两次上下文切换以及两次数据拷贝;

        2.1 将应用程序缓存中的数据,CPU Copy到socket网络发送缓冲区,即Socket Cache;

        2.2 将Socket Cache的数据, DMA Copy到网络,由网卡进行网络传输。
可以发现,完成一次读写操作,需要4次上下文切换,2次DMA数据拷贝,2次CPU数据拷贝,实际上,如果仅仅是数据传输,那么数据根本不会经过这么多次的拷贝。

DMA: Driect Memory Access, 它可以独立的直接读取系统内存,不需要CPU介入,像显卡,网卡之类都会用DMA。

2 零拷贝

零拷贝(Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输数据时节省CPU周期和内存带宽。零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效的提高数据传输效率。而且,零拷贝技术减少了用户进程地址空间和内核地址空间因为上下文切换而带来的开销。

 常见的零拷贝技术分类:

1. 直接I/O:数据直接跨过内核缓冲区,在用户地址空间与I/O设备之间传递,内核只是进行必要的虚拟存储配置等辅助工作。

2. 数据传输不经过用户空间:当应用程序在数据传输过程中不需要对数据进行访问时,则可以避免将数据从内核空间到用户空间之间的拷贝,传输的数据在页缓存中就可以得到处理;Linux中提供类似的系统调用主要有mmap(),sendfile()以及splice().

3. 写时复制:数据不需要提前拷贝,而是当需要修改的时候再进行部分拷贝。COW是对数据在Linux的页缓存和用户进程的缓冲区之间的传输过程进行优化手段。

下面是介绍数据传输不经过用户空间的零拷贝技术:mmap和sendfilr,这也是Netty、Kafka、RocketMQ等矿界所使用的底层技术

2.1 sendfile调用

Linux 在版本 2.1 中引入了 sendfile() 这个系统调用,sendfile()是一种零拷贝的实现。Java对sendfile的支持就是NIO中的FileChannel.transferTo()或者transferFrom()

使用senfile进行网络数据传输流程为:

1. 发起sendfile() 系统调用,上下文切换一次。将文件中的数据DMA Copy到Page Cache中。

2. 继续将Page Cache中的数据CPU Copy到与Socket Cache中去。

3. 继续将Socket Cache的数据DMA Copy到网卡,由网卡进行网络传输。sendfile()系统调用返回,上下文切换一次。

可以看到整个流程,减少了一次CPU Copy,减少了两次的上下文切换,相比于传统IO确实提高了性能。

但是数据仍然需要一次从Page Cache到Socket Cache的CPU Copy,这个Copy能不能也去掉呢?

当然可以,Linux 2.4+ 版本之后,文件描述符结果被改变,借助DMA Gather(带有收集功能的DMA),sendfile()再次减少了一次 Copy 操作,变成了真正的零拷贝(没有CPU Copy)。

此时整个步骤变为:

1. 发起sendfile() 系统调用,上下文切换一次。将文件中的数据DMA Copy到Page Cache中。

2. 继续将Page Cache中的带有文件位置和长度信息的缓冲区描述符CPU Copy到Socket Cache中去,这部分拷贝很少的数据,可忽略。

3. 继续借助DMA Gather ,直接将Scocket Cache的真正数据DMA Copy到网卡,由网卡进行网络传输。这样就避免了最后一次CPU Copy。sendfile() 系统调用返回,上下文切换一次。

sendfile + DMA Gather流程如下:

sendfile + DMA Gather,使得整个传输只需要两次上下文切换,数据只需要两次DMA Copy,降低了上下文切换和数据拷贝带来的开销,极大的提升了数据传输的效率,没有CUP拷贝,是真正的零拷贝。

但是,sendfile调用有一个缺点,那就是无法在sendfile调用过程中修改数据,因此sendfile()只是适用于应用程序地址空间不需要对所访问数据进行处理的和修改情况,常见的就是文件传输,或者MQ消费消息的获取,如果想要在传输过程中修改数据,可以使用mmap系统调用。

mmap调用是一个比sendfile调用昂贵但优于传统I/O的零拷贝实现方式,而mmap调用则可以在中途直接修改Page Cache中的数据,这也是mmap零拷贝的优点。

2.1 mmap调用

mmap(Memory Mapped Files)是一种零拷贝技术,学名内存映射文件,Java的实现就是MappedByteBuffer,通过channel#map方法得到。

mmap将一个文件(或者文件的一部分)映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间的对应关系。注意这个时候并没有分配和映射到具体的物理内存空间,而是第一次加载这个文件的时候,通过MMU把之气那虚拟地址换算成物理地址,把文件加载进物理地址--内核空间的Page Cache中。

实现这样的映射关系后,进程就可以通过指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必要再调用read、write等系统调用函数,相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程之间的文件共享。

简单来说,使用mmap之后,数据无需拷贝到用户空间中,应用程序可以直接操作Page Cache中的数据。

mmap()代替read()调用之后的数据发送流程为:

buf = mmap(file, len);
write(sockfd, buf, len);

使用mmap技术之后,数据流转图如下所示:

 此时整个步骤变为:

1. mmap(): 涉及到两次上下文切换以及一次数据拷贝;

        1.1 发出mmap系统调用通知,发生一次上下文切换。通过DMA引擎将磁盘文件中的内容拷贝到内核空间的一个缓冲区(Page Cache)中。

        1.2 mmap系统调用返回,发生一次上下文切换。此后用户空间和内核空间共享整个缓冲区,用户空间就可以像在操作自己缓冲区中的数据一样操作这个由内核空间共享的缓冲区数据,而不需要将数据在内核空间和用户空间之间来回拷贝。

2. write():涉及到两次上下文切换以及两次数据拷贝;

        2.1 发起write调用,发生一次上下文切换。将缓冲区(Page Cache)的内容CPU Copy到Socket Cache

        2.2 将Socket Cache的数据,DMA Copy到网卡,由网卡进行网络传输。write调用返回,发生一次上下文切换。

这种mmap+write的方式相比于传统IO少了一次CPU Copy,从而极大地提高了效率。虽然性能弱于sendfile零拷贝,但其好处是可以在中途修改内存中的数据之后再传输。

另外,当应用程序往 mmap 输出数据时,此时就直接输出到了内核态的缓冲区数据,如果此时输出设备是磁盘的话,不会立即写磁盘,linux系统下通常会间隔是30秒由操作系统自动落盘,也可手动调用fsync()函数让其立即落盘,实现真正的持久化。

2.2 MQ中的应用

对于Kafka来说:

1. 数据从Producer到Broker,需要将来自网卡的消息持久化的磁盘中,Kafka中采用mmap的方式写,并且不会立即持久化到磁盘中,而是存入page cache内核缓冲区中就直接返回成功。后续有消费者来拉取消息的时候,也是先冲缓冲区中查找消息,如果有就直接发送给消费者,不会再查找磁盘,又提升了拉消息的性能。实际上它的日志文件并没有用到 mmap,而索引文件用了 mmap。
2. 数据从Broker到Consumer,需要将磁盘中的消息通过网卡发送出去,Kafka中采用sendfile的方式,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。

对于rocketMQ来说,如论是消息存储还是消费,都是采用mmap的方式,并且通过预热来减少大文件 mmap 因为缺页中断产生的性能问题。

参考资料:

Java 两种zero-copy零拷贝技术mmap和sendfile的介绍_刘Java的博客-CSDN博客_mmap+write对比sendfile

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

Java 两种zero-copy零拷贝技术mmap和sendfile的介绍 的相关文章

  • AIDL通信过程中设置死亡代理

    关于AIDL的使用参考学习 https blog csdn net u011240877 article details 72765136 https blog csdn net iromkoear article details 5970
  • 阿里云2核4G服务器优惠价格30元3个月?小心坑

    2024年阿里云2核4G服务器优惠价格30元3个月 活动 https t aliyun com U bLynLC 配置为云服务器ECS经济型e实例ecs e c1m2 large 3M固定带宽 系统盘为40GB ESSD Entry 活动打
  • 分辨公网IP和内网IP的方法

    公网IP一般就是对外的访问地址 内网IP就是对内的访问地址 两者的使用范围是不一样的 那如果区分客户网络的IP地址是公网IP地址还是内网IP地址呢 公网IP的地址范围是很广泛的 我们可以先了解下内网IP 因为内网IP的地址段相对是局限的 一
  • 双系统安装win7出现grub怎么解决

    我们在重装系统时 特别苹果装双系统时 会出现安装过程或者安装后的问题 发现系统开机显示grub 导致不能正常进入系统 让人很是着急 其实出现这种情况是因为系统找不到主引记录所导致 只要重建主引记录mbr即可解决 下面小编就教教大家win7系
  • 服务器超线程的好处

    服务器超线程的好处 1 提高性能 超线程通过提高整体系统吞吐量显着提高服务器性能 通过允许多个线程在单个物理内核上同时执行 超线程减少了空闲时间并最大限度地利用了可用资源 这会加快任务执行速度并缩短应用程序的响应时间 尤其是在多线程工作负载
  • IT圈大实话!卷运维不如卷网络安全

    前言 在刚刚过去的金九银十 我进行了多场网络安全的技术面试 我发现最近很多从事运维的选择了辞职 转行到了网络安全这个发展路线 说实话 运维工程师这个岗位在IT行业里面确实是处于最底层的 不管什么环节出现问题 基本都是运维背锅 薪资水平也比不
  • 小白成功搭建Elasticsearch 只需五步(包含配置xpack)

    ElasticSearch 安装成功后 是不需要使用用户名和密码就可以访问的 这也是在配置skywalking的apm过程中 连接es数据库无需设置用户名和密码的原因 启动es也非常的简单 在 bin 目录下运行elasticsearch
  • TeslaMate特斯拉神器本地Docker部署实现无公网远程访问

    文章目录 1 Docker部署TeslaMate 2 本地访问TeslaMate 3 Linux安装Cpolar 4 配置TeslaMate公网地址 5 远程访问TeslaMate 6 固定TeslaMate公网地址
  • pandas用法整理

    处理表格数据的时候经常用到pandas 每次用的时候都要去查函数 每次记不住 每次都查 哈哈哈 自己整理一下 码住 一 Pandas的数据类型 进行数据分析时 如何正确使用数据类型 这非常重要 在pandas中的数据类型和python原生数
  • 盘点那些年我们一起玩过的网络安全工具

    大家好 我是IT共享者 这篇文章给大家盘点那些年 我们一起玩过的网络安全工具 一 反恶意代码软件 1 Malwarebytes 这是一个检测和删除恶意的软件 包括蠕虫 后门 流氓 拨号器 间谍软件等等 快如闪电的扫描速度 具有隔离功能 并让
  • 数据采集才是MES系统的核心内容

    一 数据采集在MES管理系统中的应用 1 设备数据采集 MES管理系统通过与生产设备的连接 可以实时采集设备运行状态 产量 质量等相关数据 这有助于企业及时掌握设备运行状况 优化设备资源配置 提高设备利用率 2 工艺数据采集 MES管理系统
  • Linux 系统日志及其归档

    主要记录Linux 系统需要关注的日志文件 以及日志归档服务 rsyslogd 系统日志服务 rsyslogd 日志服务 rsyslogd reliable and extended syslogd 可靠 可扩展的系统日志服务 Rsyslo
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

    文章目录 1 备份 SD TF 卡为镜像文件 2 压缩镜像文件 2 1 多分区镜像文件的压缩 树莓派 普通 linux 系统等 2 2 单分区镜像文件的压缩 Nvidia Jetson Nano 等 3 还原镜像文件到 SD TF 卡
  • centos系统有什么好处?

    CentOS是一种基于开源代码的Linux操作系统 它有以下几个优势 1 稳定性 CentOS是一种非常稳定的操作系统 它的代码经过了严格的测试和审查 因此它非常适合作为服务器操作系统使 用 2 安全性 由于CentOS是基于开源代码的操作
  • Jmeter 性能-并发量计算

    并发概念 指网站在同一时间访问的人数 人数越大瞬间带宽要求更高 服务器并发量分为 业务并发用户数 最大并发访问数 系统用户数 同时在线用户数 估算业务并发量的公式 C nL T C C 3 C的平方根 说明 C是平均的业务并发用户数 n是l
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • Kubernetes (十三) 存储——持久卷-动静态分配

    一 简介 二 NFS持久化存储步骤 静态分配 1 集群外主机用上次nfsdata共享目录中创建用来测试的pv 1 3 目录 用来对三个静态pv 2 创建pv的应用文件 vim pv yaml apiVersion v1 kind Persi
  • 短信系统搭建主要因素|网页短信平台开发源码

    短信系统搭建主要因素 网页短信平台开发源码 随着移动互联网的快速发展 短信系统已成为企业和个人进行信息传递的重要工具 建立一个高效可靠的短信系统对于企业来说非常重要 下面我们将介绍一些影响短信系统搭建的主要因素 1 平台选择 在搭建短信系统
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告

随机推荐

  • Node.Js基础知识

    Node Js架构 Natives modules 当前层内容由JS实现 提供 应用程序可直接调用库 例如 fs path http等 JS语言无法直接操作底层硬件设置 Builtin modules 胶水层 Builtin modules
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • 解决高德地图UnsatisfiedLinkError问题

    今天遇到一个bug 高德地图3d地图java lang UnsatisfiedLinkError 问题分析 没有找到libgdamapv4sdk751 so java lang UnsatisfiedlinkError 的解释如下 Thro
  • 交换机自学习和转发帧

    交换机自学习和转发帧 主机A给主机B发送帧 首先假设已经通过arp协议得到主机B的MAC地址 当交换机1收到该帧后将源MAC地址和接口登记 然后在帧交换表中查到目的MAC地址 没有找到就进行盲目转发 泛洪 交换机2收该帧后 做相同的动作 主
  • vue中常用的数组方法

    Vue中常用的数组方法 filter map forEach find findIndex some every filter map forEach find findIndex some every filter filter 方法创建
  • OpenMMLab AI实战营第一天笔记

    计算机视觉基础与openmmlab介绍 机器学习和神经网络简介 机器学习基础 机器学习是什么 从数据中学习经验 以解决特定问题 机器学习的典型范式 监督学习 有标签 无监督学习 无标签 强化学习 让智能体自己适应环境 机器学习中的分类问题
  • 联想小新笔记本,16G运行内存只能使用13.9G或14.9G的解决方案

    1 问题描述 我的电脑是联想小新Pro 16 一共有16G的运行内存 但实际情况只能使用13 9G 如下图所示 2 解决方案 这需要进入电脑BIOS 更改配置 1 电脑关机 在开机的时候一直点F2 进入到BIOS模式 并把语言设为中文 2
  • 缺陷管理与测试用例

    一 提交缺陷注意实现 可重现 发现缺陷可以在开发人员的电脑上实现 唯一性 每个缺陷有一个编号 也就是编号的ID 缺陷报告每行是一个缺陷 规范性 提交的缺陷需要符合公司制定的规范要求 缺陷报告的规范 ID 标题 重现步骤 期望结果 实际结果
  • 除了快手与抖音,“云想科技们”也在加速“出圈”

    在电商行业 大家可能听说过传统电商行业的 代运营 现在短视频赛道崛起 代企业运营 以效果为前提 做出符合企业品牌价值好的 新的内容的短视频营销服务商也受到更多关注 云想科技就是其中的代表 在行业新常态下 布局新业务依旧是企业寻求增长新动力的
  • Visual Grounding任务常用数据集介绍RefCOCO、RefCOCO+、RefCOCOg、ReferItGame和Flickr30K Entities

    Visual Grounding任务常用的数据集有五个 RefCOCO RefCOCO RefCOCOg ReferItGame和Flickr30K Entities RefCOCO RefCOCO RefCOCOg 是三个从MSCOCO中
  • linux服务器使用gustat指令查看gpu显卡的使用情况(比nvidia-smi好用)

    使用gpustat指令需要先安装gpustat 安装需要root权限 apt install gpustat 查看gpu使用情况 gpustat nvidia smi gpustat相比于nvidia smi查看的信息更加详细 可以看到使用
  • flex布局宽高度设置不成功

    flex布局中 会出现是在宽高 但是不起作用 那是因为flex布局当不够的时候自动压缩了 可以选择 让其不压缩 flex shrink 0 然后在设置宽高 或者利用复合属性 flex 0 0 83rpx 这篇博客是对flex布局的讲解 以及
  • 如何给证件照换一个背景颜色

    我们在考试报名的时候 经常是不同的考试需要不同的登记照尺寸和背景颜色 但是我们基本上不可能每种颜色的证件照都去拍一张吧 那样也太麻烦成本也太高 所以通过前端实现了一个改变证件照背景颜色的方法 他可以将证件照的背景颜色修改为任意的颜色 而不局
  • 微信小程序支付中的prepay_id获取方法,以及微信支付统一签名算法闭坑

    class Wechat 公众号的或者小程序支付参数 private appId private appSecret 商家的配置信息 private mch id private mch key 回调地址 public notify url
  • 前台与后台数据交互

    后台取到的数据在前台应该用EL表达式显示 xx xx 如果要给前台单选按钮赋值 需要用js进行判断 满足条件后 id attr checked true false 设置选中状态 设置单选按钮及下拉列表不可用是disabled disabl
  • for循环之斐波拉契数列

    题目大意 菲波那契数列是指这样的数列 数列的第一个和第二个数都为1 接下来每个数都等于前面2个数之和 给出一个正整数k 要求菲波那契数列中第k个数是多少 Input 输入一行 包含一个正整数k 1 lt k lt 46 Output 输出一
  • 在C++中调用OpenSSL库进行编程

    目录 OpenSSL简介 下载OpenSSL库并配置实验环境 OpenSSL库的加密函数的认识 使用 EVP 库实现 DES 和 AES 加密 EVP EncryptUpdate 函数参数详解 OpenSSL加密实践 RSA 密钥生成 RS
  • 第一次面试前端实习生心得

    今天第一次去面试前端岗位的实习生 公司规模不算大吧 不过也有好几个部门 说说我的面试心得吧 首先是hr面 如下是她问的问题 学这个多久了 大四还有没有课 是否只需完成毕业设计就行了不用上课 同学暑假都在干嘛 学校课程学了什么 同学们主要找哪
  • (转载)我们需要什么样的字段类型

    数据库定义到char类型的字段时 不知道大家是否会犹豫一下 到底选char nchar varchar nvarchar text ntext中哪一种呢 结果很可能是两种 一种是节俭人士的选择 最好是用定长的 感觉比变长能省些空间 而且处理
  • Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

    详细介绍了两种zero copy零拷贝技术mmap和sendfile的概念和基本原理 目录 1 标准IO 2 零拷贝 2 1 sendfile调用 2 1 mmap调用 2 2 MQ中的应用 1 标准IO 很多软件是基于server cli