You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向磁盘-backed的mmap文件缓冲区写入时出现Minor Page Faults原因咨询

问题成因解释

核心触发逻辑

你观测到的次缺页是Linux内核处理磁盘文件共享映射脏页回写的标准行为,具体原因如下:

  • 对于磁盘-backed的共享mmap映射,当你写入映射页后,该页会被标记为脏页,内核异步回写脏页到磁盘前,会主动清除该页对应页表项(PTE)的可写权限位。下次你再写入该页时,会触发写保护类型的次缺页:内核重新给页表项授予可写权限、重新标记页为脏,整个过程不需要读取磁盘,因此属于次缺页。
  • tmpfs属于内存文件系统,其文件页不需要回写到持久化块设备,内核不会因为回写逻辑清除tmpfs映射页的页表可写位,因此不会触发这类次缺页,和你的测试结果一致。

为什么中间写入buf会加剧该现象

你在两次mmap写入之间循环写入4MB的buf缓冲区,会持续给系统造成内存回收压力,触发内核的脏页回写线程提前将你刚写脏的mmap磁盘页回写,每次回写都会清除对应页的可写权限,下次写入就会触发次缺页。
该逻辑也符合你观测到的「迭代次数增加、次缺页数量线性上涨」的现象:每轮循环写入的mmap页大概率会在中间写buf的阶段被触发回写、清除可写位,下轮循环写入新的mmap偏移时就会产生新的次缺页。

为什么预缺页不生效

你前期用MAP_POPULATE+memset做的预缺页,仅能完成首次页表映射、避免第一次访问的次缺页,无法干预后续内核回写逻辑动态清除页表可写位的行为,因此后续仍然会产生次缺页。

内容的提问来源于stack exchange,提问作者nullptr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:24:03