mmap + page cache(零拷贝)详解

news/2025/12/8 14:23:24/文章来源:https://www.cnblogs.com/xfydaydayup/p/19321589

mmap + page cache(零拷贝)详解

1) 什么是“零拷贝”?要解决的问题

传统 I/O 在把数据从应用发送到磁盘或网络时,会在用户态 ↔ 内核态之间做多次拷贝(消耗 CPU 与内存带宽):

  • 用户缓冲区 → 内核缓冲区(write)
  • 内核缓冲区 → 网卡(DMA)

“零拷贝”是指尽量减少或避免这些内核/用户之间的内存拷贝,把数据直接由内核页缓存(page cache)或 DMA 使用,从而节省 CPU 和内存带宽,提高吞吐并降低延迟。

重要:操作系统层面通常仍会有内存页的移动/引用,但避免了显式的数据拷贝(memcpy)在用户空间和内核空间之间。


2) page cache 是什么?它的作用

  • page cache(页缓存) 是操作系统用来缓存磁盘数据的内存区域(以页为单位,通常 4KB)。
  • 读文件时,内核会把文件页读入 page cache,随后应用直接从内存读取(避免磁盘)。
  • 写文件时,内核把数据写入 page cache 的脏页(dirty page),并在后台异步写回磁盘(写回叫 writeback)。

关键要点:

  • page cache 是“内核的内存映射区域”,是 mmap 零拷贝的核心。
  • 在有 page cache 的情况下,很多读写操作不需要直接与磁盘交互。

查看 page cache(Linux):/proc/meminfoCached 字段,free -m 等。


3) mmap 是什么?它做了什么?

mmap 把磁盘文件的一段映射到进程的虚拟地址空间——文件内容就像内存一样可以直接读写

行为要点:

  • 第一次访问映射的地址会触发 page fault,内核把对应页从磁盘读入 page cache,然后映射到进程页表。
  • 写入 mmap 区域会把该页标记为 dirty,最终由内核异步 flush 到磁盘,或者通过 msync() / fsync() 强制同步到磁盘。
  • mmap 操作本身主要是建立页表映射(没有拷贝文件内容到用户缓冲区的 memcpy),因此在读写上节省了内核/用户拷贝。

常用标志:

  • MAP_SHARED:写入影响底层文件(且会被写回磁盘)
  • MAP_PRIVATE:写入为写时复制,不影响原文件
  • PROT_READ/PROT_WRITE:权限
  • msync(或 msync(MS_SYNC))用于显式刷新修改到磁盘

4) mmap + page cache 为什么属于“零拷贝”?

  • 当应用 mmap 映射文件并直接写内存时,没有发生 write() 的用户态 → 内核态的拷贝(即没有额外 memcpy)。
  • page cache 已经持有数据页;写网络(例如 sendfile())时内核可以直接把 page cache 页 DMA 到网卡,避免把页先拷贝到内核缓冲区再发送。
  • 结果:用户态数据直接在映射内存被修改,内核在需要时把页缓存给硬件用,省掉了多次内存拷贝。

举例对比:

  • 传统:用户缓冲区 → (write) → 内核缓冲区 → (DMA) → 网卡
  • mmap/sendfile:文件页(page cache)→ (DMA) → 网卡;用户只是修改映射页(无 memcpy)

5) mmap 的生命周期与页(page)细节

  • Page fault(缺页中断):首次访问触发,把文件页读入 page cache 并映射到进程地址空间。
  • Dirty page:写后页被标记为 dirty;内核会在后台 writeback。
  • writeback:内核把 dirty page 写回磁盘(异步),通过 pdflush/flush 线程。
  • msync/munmap/fdatasync/fsync:显式或间接触发写回并保证磁盘持久化。
  • swap:内存压力下,页可能被换出到交换区(注意:映射文件的写入页换出也可能触发回写)。

6) durability(持久性)与一致性:风险与刷盘策略

风险:如果只把数据写入 page cache(或 mmap 后未 msync),突然断电或系统崩溃,内存中的 dirty page 可能尚未写盘,数据会丢失。

保证不丢失的做法(工程实践)

  • msync(..., MS_SYNC)fsync():强制把内核 page cache 的数据刷进磁盘(阻塞直到写入设备)。
  • 打开文件时使用 O_DSYNC/O_SYNC:写系统调用本身等待数据写回磁盘(代价高)。
  • 对分布式消息系统(如 RocketMQ):使用同步复制(SYNC_MASTER)+ 同步刷盘(SYNC_FLUSH)或使用 DLedger(一致性复制),把风险转移到多个副本上。

吞吐 vs 持久性:越强的持久性(sync),吞吐越低。工程上常见折中:

  • 业务允许丢数据少量:异步刷盘 + 异步复制,提高吞吐
  • 严格不丢:同步刷盘 + 同步复制或多副本多数写入

7) Zero-copy 在网络 I/O 的实现(sendfile/splice)

mmap 用于文件映射,sendfile(或 splice)在发送文件到 socket 时能把 page cache 的数据直接传给内核网络栈并 DMA 到 NIC,从而实现端到端零拷贝:

  • sendfile 从 page cache 拿页,直接发往网卡(避免把页拷贝到用户态缓冲区再 write)
  • splice 也能在文件描述符之间传递数据,避免拷贝

RocketMQ 场景:

  • 存储侧:mmap 提升磁盘写入的效率
  • 网络侧:如果需要可以利用 sendfile/zero-copy 发送数据(某些 broker 实现会尽量减少拷贝)

8) mmap 在 Java 中的使用注意(MappedByteBuffer)

Java 提供 MappedByteBufferFileChannel.map())。注意点很多:

  1. 不会自动释放MappedByteBuffer 的 native 映射可能被 GC 延迟释放(导致文件无法删除或日志滚动失败)。常见办法:

    • 使用 sun.misc.Cleaner(非标准,危险)
    • Java 9+ 使用 Unsafe.invokeCleaner(...)(需要权限)
    • 使用 JNI 或外部进程管理文件滚动
  2. 强制刷新MappedByteBuffer.force() 对应 msync,但可能性能开销大。

  3. 页面对齐:操作需考虑页大小(4KB),避免半页写。

  4. 堆外内存与 GC:映射的内容在 native 内存,不受 Java GC 管控,但要注意内存压力和 OOM。

  5. 权限问题:映射大量文件会占用虚拟地址空间;32 位 JVM 更受限。

RocketMQ(Java 实现)通过专门的内存池和清理机制规避这些问题——比如 transientStorePool、MappedFile 管理类、定制清理流程。


9) 实际工程中的调优点与陷阱(必读)

  • 刷盘策略:选择 SYNC_FLUSH(安全)还是 ASYNC_FLUSH(高吞吐)要权衡。
  • 主从复制策略:ASYNC_MASTER 有数据丢失风险,SYNC_MASTER 更安全但延迟高。
  • 禁用 swap 或 mlock?:关键服务可考虑 mlock 关键页以避免被 swap;也可通过 vm.swappiness=1 降低swap影响。
  • 页大小与对齐:避免频繁的小写导致大量小的 dirty page;批量写入效率更高(顺序写)。
  • 内存压力:page cache 会占用大量内存,监控 Cached/Dirty 页面,设置 vm.dirty_ratiovm.dirty_background_ratio 合理阈值。
  • 文件句柄与虚拟地址空间:大文件或大量映射会耗尽 fd 或虚拟地址;在容器/单机上要调 ulimit -n 与 JVM 选项。
  • MappedByteBuffer 释放:在 Java 中特别注意映射文件释放的实现,避免文件锁死。
  • NUMA/CPU 缓存一致性:在多 NUMA 节点上,映射和 DMA 绑定策略会影响性能;需要考虑内存分配策略和 CPU 亲和性。
  • IO 调度与 readahead:顺序写可以禁用 readahead,随机读场景需提高 readahead 或使用 madvise(MADV_SEQUENTIAL)。

10) 常用诊断命令 / 性能测试手段

  • free -m / cat /proc/meminfo:查看 page cache 占用
  • vmstat 1:查看 writeback、io等待
  • iostat -x 1:磁盘 I/O 性能
  • ss -tin / tcpdump:网络层问题
  • perf / ftrace:追踪 page fault 与 syscall 开销
  • fio:磁盘基准(顺序写、随机写)
  • Java 层:jmap/jcmd/jstack,以及查看 MappedByteBuffer 使用

11) 在 RocketMQ 场景下的具体应用

RocketMQ 的 CommitLog 采用 mmap + page cache 的组合(并结合自己的内存池/刷盘策略)带来几个好处:

  • 顺序写:写入同一本地 commit log 的开销极低(顺序写 + mmap)
  • 高吞吐:大量消息写入几乎不用 memcpy,靠 page cache 聚合写回
  • 快速读取:消费者通过索引(ConsumeQueue)定位 CommitLog,内核页缓存命中率高,读取延迟低

但 RocketMQ 为了保证可靠性会提供两类刷盘/复制策略以平衡持久性与吞吐:

  • 异步刷盘 + 异步复制:极高吞吐、有丢失可能
  • 同步刷盘 + 同步复制(或 DLedger):低吞吐、强可靠

RocketMQ 还实现了 transientStorePool(临时存储池)来缓解 mmap 写入热/冷页面带来的抖动。


12) 工程师实战建议(快速清单)

  • 生产环境:默认使用 mmap + page cache(高性能),但对于强一致场景同时使用 SYNC_MASTER + SYNC_FLUSH 或 DLedger
  • 如果业务允许少量数据丢失:启用异步刷盘以换取吞吐。
  • 在 Java 中:使用成熟的 MappedFile 管理类并严格处理资源释放(避免文件锁死)。
  • 监控指标:Dirty 页、writebackfsync 延迟、磁盘队列长度、page fault rate。
  • 测试:用 fio / 自制压测脚本做顺序写/顺序读/并发读写基准,并在不同刷盘策略下对比吞吐与延迟。
  • 容器化时:注意虚拟地址空间和 ulimits,尽量运行在有足够内存和调好 swappiness 的宿主机上。

结语(一句话)

mmap + page cache 的价值在于把磁盘 I/O 的“显式拷贝”交给内核页缓存管理,从而节省 CPU 和内存带宽;但要记住:这把可靠性问题(是否写盘)和性能问题(何时 flush)交给了你作为工程师去正确配置。

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

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

相关文章

绵阳购买商标公司的平台哪家靠谱?2025 权威榜单公布 + 避坑指南

经过 2025 年权威测评,福象商标宝 AI(微信小程序) 凭借母公司福象知识产权集团的专业背景、200 万 + 真实一手标源、透明无隐形收费、2 个月快速过户及强大国际转让能力,成为绵阳企业 / 个人购买商标的首选平台,综…

2025年geo优化公司哪家专业?权威选型指南与优质企业推荐

2025年,GEO优化行业完成从“新兴赛道”到“主流营销标配”的跨越,国内市场规模激增至480亿元,AI技术的深度渗透让行业竞争焦点从“基础优化”转向“精准化、智能化”升级。AI seo优化与生成式引擎优化成为核心驱动力…

2025 年 12 月桃胶品牌深度推荐榜:即食桃胶、牛奶桃胶、燕窝桃胶、碗装桃胶,甄选滋补养颜口碑之选

2025 年 12 月桃胶品牌深度推荐榜:即食桃胶、牛奶桃胶、燕窝桃胶、碗装桃胶,甄选滋补养颜口碑之选 桃胶,作为传统滋补食材,近年来因其富含植物胶原蛋白、膳食纤维等营养成分,契合现代消费者对便捷、健康、养颜的追…

2025年五大玻璃钢格栅靠谱生产商排行榜,实力厂家与服务商厂

为帮助企业高效锁定适配自身需求的玻璃钢格栅合作伙伴,避免选型走弯路,我们从生产工艺精度(如原材料纯度、成型工艺稳定性)、产品性能表现(含耐腐蚀强度、承重等级适配)、全周期服务质量(覆盖定制设计到安装售后…

202最新富氢水供应商 / 厂家 TOP5 评测!行业专业数据市场口碑及优质品牌选择指南,科技赋能 + 健康生态权威榜单发布,引领健康饮水新革命

随着氢健康理念的普及,富氢水作为健康饮水的重要选择,市场需求持续攀升。本榜单基于技术实力、产品品质、服务体系、市场口碑四大维度,结合行业调研数据与用户反馈,权威解析2025年五大富氢水品牌综合实力,为消费者…

MyBatis-Plus 实战:MPJLambdaWrapper 多表联查用法全解析 - 指南

MyBatis-Plus 实战:MPJLambdaWrapper 多表联查用法全解析 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

2025.12.8日14:10-connective tissue结缔组织〔如肌肉等〕

ai智能发布助手当前Linux当前项目已使用内存MB是199 南京9℃ 晴 Let go of past emotions and resentments; free yourself. 放下过去的情感和怨恨,让自己解脱。 今日热点如下 挑战者杯,湖人险胜76人,杨瀚森首次首发…

2025年湖南房屋装修公司口碑榜:旧房翻新、老房改造装修公司

本榜单基于湖南本地装修市场调研与真实业主口碑,聚焦房屋装修核心痛点,筛选出5家能切实解决旧房翻新、老房改造需求的标杆企业,为业主提供客观选型依据,助力避开装修陷阱。 TOP1 推荐:金煌家装 推荐指数:★★★★…

2025 攀枝花购买商标平台哪家靠谱?8 家正规平台资质 + 服务实测报告

2025 年攀枝花中小企业品牌化进程加速,商标作为企业核心知识产权的价值愈发凸显。据本地行业调研显示,攀枝花地区商标转让咨询量同比增长 42%,但企业在商标获取过程中仍面临诸多困境:自主申请商标审核周期长达 6-8…

arthas在idea和docker中的应用

基于IDEA工具使用 1,安装arthas插件https://i-blog.csdnimg.cn/direct/a47c348589274ef2a1dd13496015a78b.png 安装之后重启,然后再代码区域右键如果可以看到如下菜单选项,则说明安装成功 https://i-blog.csdnimg.c…

Revive Adserver 中的IDOR漏洞:跨管理者广告条删除风险

本文详细披露了Revive Adserver中一个高风险IDOR漏洞,允许攻击者删除其他管理者的广告条。报告包含漏洞原理、复现步骤、影响分析及官方修复确认。IDOR漏洞导致广告条被任意删除 漏洞概述 我在Revive Adserver中发现了…

生产事故-那些年遇到过的OOM

入职多年,面对生产环境,尽管都是小心翼翼,慎之又慎,还是难免捅出篓子。轻则满头大汗,面红耳赤。重则系统停摆,损失资金。每一个生产事故的背后,都是宝贵的经验和教训,都是项目成员的血泪史。为了更好地防范和遏…

Windows浮动ip怎么配置

Windows浮动ip怎么配置本文介绍如何在Windows系统上配置浮动IP实现高可用,类似Linux的keepalived功能。推荐使用免费软件PanguVip,通过设置主备节点的静态IP(如192.168.56.101/102)和浮动IP(192.168.56.103),并…

遂宁商标购买平台推荐指南(2025):从资质到服务全方位测评推荐

2025 年遂宁商标购买平台排行榜 TOP1:福象商标宝 AI(微信小程序)。依托福象知识产权集团 120 + 国家服务网络、200 万 + 可溯源一手标源、2 个月极速过户、零隐性收费及 “过户失败全额退款” 保障,以 9.95/10 的综…

内江购买商标平台哪家强?2025 实测榜单:企业购标交易高效指南

商标作为企业品牌布局的核心资产,直接影响内江本地企业(尤其是电商、制造业、服务业)开拓川南市场、打造区域品牌的效率。然而当前商标交易市场乱象频发:标源真实性难核验、“一标多卖” 欺诈时有发生、过户流程繁…

Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建股票高低收盘图

将股票价格、最高价、最低价、收盘价和交易量等财务数据可视化是分析师和开发人员的常见需求。借助Aspose.Cells for .NET,您可以直接从 C# 应用程序生成股票最高价、最低价和收盘价图表,而无需安装 Microsoft Excel…

01行业介绍和计算机基础

01行业介绍和计算机基础 1.基础概念运维工程师的责任提升效率 控制成本 发布管理 变更管理 备份恢复 灾难演练 系统分析 技术选型 ……要让上级看到你的价值,才能防止被优化 ‍ 2.运维工程师晋升通道 2.1 运维工程师岗…

2025 泸州购买商标平台测评:6 大商标交易平台深度对比 + 避坑指南

在泸州,中小企业、初创品牌及跨境电商的商标布局需求正持续攀升,但商标交易市场的乱象却让不少企业踩坑。据本地市场调研显示,泸州超 85% 的企业在购买商标时,面临本地资源匮乏、信息不对称、交易周期冗长等问题;…

软件需求与分析课堂测试九—结构化建模分析II(100分)

软件需求与分析课堂测试九—结构化建模分析II(100分) (45分钟) 班级:信2305-2 学号:20234054 姓名:茆伟昊 1、需求描述: 请设计一个仓储管理系统原型系统,该系统支持多个仓库的设立。统一 设立物资台…

2025年开花机厂家权威推荐榜单:纤维/棉/羊绒/羽绒及开松梳理机械源头厂家精选

在纺织、无纺、填充材料及再生资源回收等行业,开花机作为物料预处理的关键设备,其性能直接影响后续生产流程的顺畅度与最终产品质量。通过高速旋转的角钉或针布,开花机能够高效地将压实的纤维块、旧棉絮、羽绒等原料…