页缓存技术(PageCache/sendfile/mmap)

核心概念解析

1.PageCache(页缓存)

  • 是什么
    Linux 内核将磁盘文件数据缓存在物理内存中的一块区域,称为 PageCache。
  • 作用
    • 读操作:若数据在 PageCache 中,直接返回,避免磁盘 I/O
    • 写操作:先写入 PageCache,由内核异步刷盘(write-back),提升写性能。
  • 特点
    • 对所有进程透明共享;
    • LRU 策略淘汰冷数据;
    • 是“零拷贝”技术的基础。

2.mmap(Memory-Mapped File)

  • 是什么
    将一个文件直接映射到用户进程的虚拟地址空间,程序可像操作数组一样读写文件。
  • 系统调用
    void*addr=mmap(NULL,length,PROT_WRITE,MAP_SHARED,fd,0);
  • 工作原理
    • 不立即加载文件内容;
    • 当程序访问addr[i]时,触发缺页中断(Page Fault)
    • 内核分配物理页,从磁盘(或 PageCache)加载数据;
    • 后续读写直接操作内存,无需read()/write()系统调用
  • 优点
    • 减少系统调用和上下文切换;
    • 适合大文件随机访问或高频小写。

注意:mmap 本身不等于零拷贝,但它为高效 I/O 提供了基础。

3.sendfile(零拷贝网络传输)

  • 是什么
    Linux 提供的系统调用,允许直接从文件描述符传输数据到 Socket,全程由内核完成。
  • 系统调用
    ssize_tsendfile(intout_fd,intin_fd,off_t*offset,size_tcount);
  • 工作原理(Linux 2.4+)
    • 数据路径:磁盘 → PageCache → 网卡
    • CPU 不参与数据拷贝,仅由 DMA 控制器完成;
    • 内核通过Scatter-Gather DMA直接组装网络包。
  • 前提条件
    • 源必须是文件(支持mmap);
    • 目标必须是 Socket;
    • 数据需在 PageCache 中(否则先加载)。

sendfile 是真正的“零拷贝”(Zero-Copy)。

交互流程图(Mermaid Sequence Diagram)

以下分别绘制传统 I/Ommap 写入sendfile 读取三种场景的数据流,并标注关键组件交互。

DiskKernel (PageCache)NIC (Network)User ProcessDiskKernel (PageCache)NIC (Network)User Process场景1: 传统 read() + write() —— 4次拷贝, 4次上下文切换场景2: mmap 写入文件 —— 1次CPU拷贝, 0次显式系统调用场景3: sendfile 读取并发送 —— 0次CPU拷贝, 零拷贝!1. read(fd, buffer, size)2. DMA: 磁盘 → PageCache3. 数据加载完成4. CPU拷贝: PageCache → 用户buffer5. write(socket, buffer, size)6. CPU拷贝: 用户buffer → Socket缓冲区7. DMA: Socket缓冲区 → 网卡8. 发送完成9. *(mmap_addr + offset) = data10. 缺页中断 (Page Fault)11. (若冷数据) DMA: 磁盘 → PageCache12. 映射物理页到虚拟地址13. 数据已写入 PageCache14. (异步) DMA: PageCache → 磁盘15. sendfile(socket, file_fd, offset, count)16. (若冷数据) DMA: 磁盘 → PageCache17. DMA: PageCache → 网卡 (Scatter-Gather)18. 发送完成

关键对比:拷贝次数与上下文切换

场景CPU 拷贝次数DMA 拷贝次数上下文切换是否零拷贝
传统 I/O2 次2 次4 次
mmap 写入0~1 次*1~2 次0~1 次*❌(但高效)
sendfile 读取0 次2 次2 次

*注:mmap 首次访问触发缺页中断算 1 次上下文切换,后续无开销。

三者如何协同工作?

在高性能服务中,mmap + PageCache + sendfile 可形成完美闭环

  1. 写入阶段
    • 应用通过mmap将数据写入文件 → 数据进入PageCache
  2. 读取阶段
    • 另一请求调用sendfile读该文件 → 内核发现数据已在PageCache
    • 直接通过DMA将 PageCache 数据发往网卡;
  3. 全程
    • 无 CPU 拷贝
    • 无用户态参与
    • 延迟最低、吞吐最高

🌰 典型应用:

  • Web 服务器(如 Nginx)静态文件服务;
  • 消息队列(RocketMQ/Kafka)消息读取;
  • 数据库 WAL 日志传输。

注意事项

  1. PageCache 是共享资源

    • 若系统内存不足,PageCache 被回收 → 性能骤降;
    • 建议为 I/O 密集型服务预留足够内存。
  2. mmap 不等于持久化

    • 数据在 PageCache 中可能因断电丢失;
    • 需调用msync()或依赖 OS 刷盘策略。
  3. sendfile 有局限性

    • 不能修改数据(如加解密、压缩);
    • 若需处理数据,仍需传统 I/O。

总结

  • PageCache:操作系统级缓存,是高性能 I/O 的基石;
  • mmap:让用户态高效写入文件,减少系统调用;
  • sendfile:实现真正的零拷贝网络传输,释放 CPU;

💡三者结合 = 最大化利用硬件(DMA)、最小化 CPU 干预 = 极致 I/O 性能

概括

“mmap 是写入数据,sendfile 是发送数据”
mmap 主要优化写入路径(文件生成),sendfile 优化读取+网络发送路径(文件分发)。

“都使用了 PageCache”
PageCache 是 Linux I/O 性能的“中枢”,无论是read/writemmap还是sendfile,只要操作普通文件,默认都会经过 PageCache(除非用O_DIRECT绕过)。

“mmap 将数据写入 PageCache 后异步刷盘,不等待,体现响应优势”
mmap 的写入本质上是写内存(虚拟地址)→ 触发缺页 → 写 PageCache,应用线程立即返回,刷盘由内核后台完成。这显著降低了写入延迟,特别适合高频小写场景(如日志、消息)。

“sendfile 直接跳过 UserProcess,连接 PageCache 到网络端口,避免拷贝”
传统read + write需要把数据从内核拷到用户态再拷回内核,而 sendfile全程在内核态完成,CPU 不搬运数据,仅靠 DMA 控制器传输,真正实现“零 CPU 拷贝”。

注意事项

  • mmap 本身不保证数据持久化(断电可能丢),需配合msync()或依赖 OS 刷盘策略;
  • sendfile 要求源是文件、目标是 socket,且不能修改数据内容(如加密、压缩),否则仍需传统 I/O。

传统read/writevsmmapvssendfile对比表

维度传统read() + write()mmap()(用于写入)sendfile()(用于读取+发送)
典型用途通用文件读写高频写入/大文件映射文件 → Socket 零拷贝传输
是否经过 PageCache✅ 是✅ 是✅ 是
CPU 数据拷贝次数2 次
(PageCache ↔ 用户 buffer)
0 次
(直接写 PageCache)
0 次
(PageCache → NIC)
DMA 拷贝次数2 次1~2 次2 次
上下文切换次数4 次
(read 进/出 + write 进/出)
0~1 次
(仅首次缺页中断)
2 次
(sendfile 调用进/出)
是否零拷贝❌ 否❌(但高效)✅ 是
写入延迟较高(需等 write 返回)极低(写内存即返回)不适用(只读)
读取+网络吞吐中等不适用(主要用于写)极高(CPU 开销最小)
能否修改数据✅ 可在用户态处理✅ 可直接修改内存❌ 无法干预数据内容
适用场景通用、需处理数据日志写入、消息存储、大文件编辑静态文件服务、消息拉取、视频流

关键结论

  • mmap 的优势在“写”:让写入像操作内存一样快,降低延迟
  • sendfile 的优势在“读+发”:让传输像 DMA 直连一样高效,提升吞吐、降低 CPU
  • 两者都依赖 PageCache:热数据在内存中时性能最佳;
  • 传统 read/write 最灵活但开销最大:适合需要在用户态处理数据的场景(如解密、格式转换)。

高性能系统设计原则

  • 能用 sendfile 就不用 read/write(如静态资源、原始消息转发);
  • 高频写入优先考虑 mmap(如日志、CommitLog);
  • 必须处理数据时,才退回到传统 I/O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的美食信息推荐网站系统(毕业设计项目源码+文档)

课题摘要基于 SpringBoot 的美食信息推荐网站,聚焦美食消费 “个性化推荐、信息精准触达、场景化选品” 的核心需求,针对传统美食网站 “内容同质化、口味匹配度低、场景适配性差” 的痛点,构建覆盖消费者、餐饮商家、平台运营者的全流程智能…

浙江大学团队全球首创AI创新能力测试:让机器人也能当“发明家“

这项由浙江大学张宁宇教授领导的研究团队与蚂蚁集团联合完成,发表于2025年的国际顶级会议,研究编号为arXiv:2512.01822v1。有兴趣深入了解的读者可以通过该编号查询完整论文。过去几年,我们见证了AI在下棋、写代码、解数学题方面的惊人表现。…

基于SpringBoot的面试刷题平台系统的设计与实现(毕业设计项目源码+文档)

课题摘要基于 SpringBoot 的面试刷题平台系统,聚焦求职备考 “精准刷题、能力评估、个性化学习” 的核心需求,针对传统刷题平台 “题库杂乱、缺乏针对性、学习效果难量化” 的痛点,构建覆盖考生、企业 HR、平台管理员的全流程刷题备考生态。系…

字节跳动团队揭示如何让万能AI变得更高效

这项由字节跳动种子实验室何帅威、邓朝瑞、严申,以及马里兰大学帕克分校李昂共同完成的研究,发表于2025年12月的arXiv预印本平台(论文编号:arXiv:2512.02351v1),为我们揭示了一个有趣的现象:那些…

密歇根大学让AI视觉推理更靠谱:从“瞎猜“到“真看懂“的技术革命

这项由密歇根大学侯新海、亚马逊徐韶远等学者共同完成的研究,发表于2025年1月的arXiv预印本平台(编号:arXiv:2511.19661v1),为解决AI视觉推理中的"作弊"问题提供了全新解决方案。有兴趣深入了解的读者可以通…

南洋理工大学团队重新定义AI看世界:让机器像人类一样观察和思考

这项由南洋理工大学、南京理工大学、阿德莱德大学、百度、CSIRO以及商汤科技等多家知名机构合作的研究发表于2024年12月,研究团队包括唐伟、孙彦鹏、张珊、李晓凡等众多学者。有兴趣深入了解的读者可以通过论文编号arXiv:2512.01988v1查询完整论文。这项名为"A…

韩国大学团队揭秘:ChatGPT等AI模型是如何“类比思考“的?

这项由韩国大学的李台雨、宋旼珠、尹赞雄、朴政宇以及姜在宇等研究者共同完成的研究发表于2025年11月的人工智能顶级会议AAAI 2026,研究编号为arXiv:2511.20344v1。对这一前沿研究感兴趣的读者可以通过该编号查询完整论文。在日常生活中,我们经常会做这样…

工程项目管理工作台怎么搭建?掌握这四点就够了

目录 一、工作台的核心价值 二、四大核心模块 (一)履约分析:给项目做 “健康体检” (二)资源配置:把人、钱、物管细管好 (三)项目画像:给每个项目建 “数字身份证”…

内部收益率IRR是什么?3分钟掌握

目录 一、IRR到底是什么? 二、为什么要用IRR? 案例1 案例2 三、IRR怎么算? 四、IRR怎么看? 1、和你的资金成本比 2、和机会成本比 3、行业通常有基准线 五、IRR的局限性 问题1:多重IRR 问题2:再…

大语言模型在金融市场异常检测中的推理应用

大语言模型在金融市场异常检测中的推理应用关键词:大语言模型、金融市场异常检测、推理应用、数据处理、模型评估摘要:本文聚焦于大语言模型在金融市场异常检测中的推理应用。首先介绍了该研究的背景、目的、预期读者等信息,接着阐述了大语言…

C++用new创建对象和不用new创建对象的区别解析

我们都知道C中有三种创建对象的方法&#xff0c;如下&#xff1a;#include <iostream>using namespace std;class A{private:int n;public:A(int m):n(m){}~A(){}};int main(){A a(1); //栈中分配A b A(1); //栈中分配A* c new A(1); //堆中分配delete c;return 0;}…

仓库管理的五大环节,你都做到位了吗?

目录 一、入库 1、要提前准备 2、验收核对 3、遇到异常情况怎么办&#xff1f; 4、及时录入 二、出库 1、审核单据 2、高效拣货 3、复核 4、交接时要留痕 三、盘点 1、提前做准备 2、盘点方法 3、执行规范 4、差异处理 四、存储 第一是分区分类 第二是先进先…

自考必看!8个高效降AIGC工具推荐

自考必看&#xff01;8个高效降AIGC工具推荐 AI降重工具&#xff1a;自考论文的“隐形护盾” 在自考论文写作过程中&#xff0c;越来越多的学生开始关注“AIGC率”和“查重率”的问题。随着人工智能技术的广泛应用&#xff0c;许多学生在使用AI生成内容时&#xff0c;发现论文中…

事务ACID特性详解

一、ACID基本概念 1. 原子性&#xff08;Atomicity&#xff09; 定义&#xff1a;事务的所有操作要么全部完成&#xff0c;要么全部不完成&#xff0c;不会停留在中间状态 比喻&#xff1a;就像银行转账&#xff0c;A账户扣款和B账户入账必须同时成功或同时失败 实现机制&am…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

计算机深度学习毕设实战-基于 人工智能深度学习算法训练数字识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

学长亲荐2026专科生必备10款AI论文写作软件测评

学长亲荐2026专科生必备10款AI论文写作软件测评 2026年专科生论文写作工具测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;AI论文写作工具逐渐成为大学生&#xff0c;尤其是专科生群体中不可或缺的辅助工具。然而&#xff0c;面对市场上琳琅满目的软件选…

含氢气氨气综合能源系统优化调度研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【课程设计/毕业设计】基于机器学习深度学习算法训练数字识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Spring 三级缓存详解

Spring 的三级缓存是解决单例Bean循环依赖的核心机制。理解三级缓存对于掌握Spring的Bean创建过程至关重要。一、三级缓存定义与作用三级缓存的含义// 在 DefaultSingletonBeanRegistry 中定义 public class DefaultSingletonBeanRegistry extends ... {// 一级缓存&#xff1a…