当前位置: 首页
科技数码
零拷贝技术解读:如何优化CPU开销提升I/O性能?

零拷贝技术解读:如何优化CPU开销提升I/O性能?

热心网友 时间:2025-10-30
转载

在实际应用中,我们可以利用sendfile技术高效传输静态文件,比如nginx就内置了对这一功能的支持;通过mmap将日志数据映射到用户空间,写入操作由内核自动刷回磁盘,显著提升了写入性能。像Kafka这样优秀的系统同样运用了零拷贝技术来增强其数据传输能力。

0. 引言

在高并发场景中,传统的I/O操作需要进行多次数据拷贝,很容易成为系统性能瓶颈。而零拷贝技术(Zero-Copy)通过消除冗余的数据拷贝,使系统轻松实现百万级吞吐量(如Kafka)。本文将从内核原理、API实现到实战应用,深入解析这项关键技术。

1. 零拷贝原理

零拷贝是一种高效的数据传输技术,核心目标是减少数据拷贝次数来提升性能,接下来我们详细探讨其实现原理。

要理解零拷贝的原理,首先需要掌握传统数据传输过程,也就是我们之前讨论的read和write流程。让我们来梳理一下(以读取磁盘数据通过网络发送为例):用户调用read系统调用来请求文件数据,此时CPU需要切换到内核态,然后通过DMA将磁盘数据拷贝到内核空间,再将内核缓冲区数据拷贝到用户空间缓冲区,之后CPU切换回用户态;对于写操作来说,用户调用write系统调用,从用户态切换到内核态,然后将数据从用户缓冲区拷贝到Socket关联的缓冲区,随后数据由DMA传送至网卡缓冲区,最后返回,从内核态切换至用户态。

图片图片

有了对传统数据传输流程的认识,我们接着来看零拷贝的相同操作流程:用户进程发起sendfile系统调用,触发DMA拷贝将数据复制到内核缓冲区,然后把内核缓冲区数据复制到网卡,将文件描述信息拷贝到socket缓冲区,随后切换回用户态。

图片

通过对上面两个流程的对比,我们可以理解,零拷贝(指的是消除了内核到用户空间的数据拷贝)就是减少了数据的拷贝和用户-内核空间的切换。

2. 零拷贝接口实现(代码均基于Linux 5.10)

2.1 sendfile

2.1.1 函数定义

sendfile用于在两个文件描述符之间传递数据。

#include 
//out_fd:输出文件描述符,通常为套接字描述符。
//in_fd:输入文件描述符,必须是一个支持 mmap() 操作的文件描述符。
//offset:指定从文件的哪个偏移量开始读取数据,如果为 NULL,则从当前文件指针位置开始。
//count:要传输的数据长度。
//sendfile() 成功返回实际传输的字节数,失败返回 -1。
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
2.1.2 函数源码解析

sendfile核心函数为do_sendfile,而do_sendfile中主要函数为splice_direct_to_actor,接下来我们对其流程梳理如下,其通过内部管道消除了向用户空间的拷贝。

图片图片

2.2 mmap

2.2.1 函数定义

mmap用于申请一段内存空间,将内核缓冲区数据映射到用户空间。

#include 
//addr:指定映射的起始地址,通常设为 NULL,由系统自动分配。
//length:映射的长度。
//prot:映射区域的保护方式,如 PROT_READ(可读)、PROT_WRITE(可写)等。
//flags:映射的标志,如 MAP_SHARED(共享映射)、MAP_PRIVATE(私有映射)等。
//fd:要映射的文件描述符。
//offset:映射的起始偏移量。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);

图片图片

2.2.2 函数源码解析

mmap中主要调用为ksys_mmap_pgoff,最终会落到do_mmap函数,其整体流程如下,通过多次检测和惰性分配以及权限分离来实现:

图片图片

2.3 splice

2.3.1 函数定义

splice用于在两个文件描述符之间移动数据。

#include 
//fd_in:输入文件描述符。
//off_in:输入文件的偏移量指针。
//fd_out:输出文件描述符。
//off_out:输出文件的偏移量指针。
//len:要传输的数据长度。
//flags:传输标志,如 SPLICE_F_MOVE(尝试移动数据)、SPLICE_F_NONBLOCK(非阻塞操作)等。
ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);
2.3.2 源码分析

其实现也是依赖管道缓冲区,通过内核区创建和转移所有权避免了向用户空间拷贝。

2.4 tee

2.4.1 函数定义

tee用于在两个管道描述符之间复制数据,和splice差异存在于一个是复制一个是移动,且tee只支持管道。

#include 
//out_fd : 待写入内容的文件描述符
//in_fd : 待读取出内容的文件描述符
//len : 需要复制的字节数
//flags : 选项
//返回值:成功:返回在两个文件描述符之间复制的字节数;没有数据:返回0
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

2.4.2 实现分析

和splice类似,只不过一个是移交所有权,一个是增加引用。

3. 实际应用以及分析

在实际场景中,我们可以使用sendfile发送静态文件,比如nginx就支持这种配置;可以通过mmap来映射日志文件数据到用户空间,写完后通过内核将数据刷到磁盘,提升写入性能。比较优秀的使用者还有kafka,其也是通过零拷贝提升其数据传输能力。

4. 总结

本文介绍了零拷贝的原理、相关接口实现和一些实际例子,下届将继续IO系列,IO性能的衡量和监控。

来源:https://www.51cto.com/article/827135.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
4月规上工业原油产量1794万吨 同比增长1.2%

4月规上工业原油产量1794万吨 同比增长1.2%

国家统计局最新发布的能源数据显示,四月份我国原油生产与加工领域呈现出截然不同的发展态势。总体来看,上游生产保持稳健增长,而下游加工环节则面临一定压力。 从生产端来看,四月份规模以上工业原油产量达到1794万吨,同比增长1 2%,增速较三月份提升1 0个百分点。日均产量约为59 8万吨,生产节奏稳步加

时间:2026-05-18 18:08
iPhone 18 Pro手机壳曝光 相机模组尺寸或进一步增大

iPhone 18 Pro手机壳曝光 相机模组尺寸或进一步增大

知名爆料人分享了iPhone18Pro系列保护壳图片。设计延续前代风格,但相机模组尺寸可能进一步扩大,机身或略增厚,导致新保护壳与旧款不兼容。屏幕尺寸预计保持不变。综合信息显示,该系列更像是前代的强化升级版,重点在于内部性能与影像系统的提升。

时间:2026-05-18 18:08
百望股份与中关村两院战略合作共建产学研创投生态

百望股份与中关村两院战略合作共建产学研创投生态

百望股份与中关村学院、中关村人工智能研究院达成战略合作,共建产学研创投生态。依托百望的真实企业交易数据与两院的科研人才优势,在合规前提下挖掘数据要素价值。双方聚焦财税金融领域,利用AI技术研发智能应用,并通过共建数据沙箱、人才通道与共创机制,推动数据智能从学术创。

时间:2026-05-18 18:08
小米SU7 GT发布会5月21日举行 多款新品同步亮相

小米SU7 GT发布会5月21日举行 多款新品同步亮相

小米创始人雷军宣布,小米YU7GT将于5月21日晚7点发布。新车定位纯血GT,拥有修长车头、跑车宽体设计,最大马力1003匹,续航705公里。同场还将推出小米17Max手机、耳夹式耳机等多款生态新品。雷军解释,YU7GT侧重长途旅行与日常使用平衡,其纽北测试旨在验证极端条件下的整车性能。

时间:2026-05-18 18:08
英伟达洽谈领投印度AI初创公司Simplismart

英伟达洽谈领投印度AI初创公司Simplismart

英伟达正洽谈领投印度AI初创公司Simplismart,计划投资约2000万美元,投后估值预计达1亿美元。该公司专注于生成式AI和MLOps,若交易达成,其估值将在数月内从2500万美元跃升近四倍,增长迅猛。英伟达今年在AI领域投资已超400亿美元,持续扩张其生态布局。

时间:2026-05-18 18:08
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程