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

为何使用mmap的rg(ripgrep)会触发更多minor page fault?

实验背景与结果

我用rg结合perf对比了mmap与pread的性能,以minor page fault作为核心指标,实验结果如下:

mmap模式

执行命令:

perf stat -e major-faults,minor-faults  rg -j1 -F 123 a-big-file --mmap

性能统计:

0      major-faults
           509      minor-faults

   0.002241400 seconds time elapsed

   0.000000000 seconds user
   0.002221000 seconds sys

非mmap模式(pread)

执行命令:

perf stat -e major-faults,minor-faults  rg -j1 -F 123 a-big-file --no-mmap

性能统计:

0      major-faults
           396      minor-faults

   0.002911774 seconds time elapsed

   0.002890000 seconds user
   0.000000000 seconds sys

空文件的mmap模式测试

执行命令:

rg -j1 -F 123 empty_file --mmap

对应的perf统计结果:

0      major-faults
           393      minor-faults

   0.001652534 seconds time elapsed

   0.000000000 seconds user
   0.001648000 seconds sys

从结果可见,使用mmap会触发更多的minor page fault,怀疑是munmap操作导致,想知道在Linux中如何深度追踪定位引发这些minor page fault的代码。


深度追踪minor page fault的方法

1. 用perf record + perf report捕获调用栈

这是最直接的方式,能快速定位触发页错误的函数链:

  • 记录事件与调用栈:
perf record -g -e minor-faults rg -j1 -F 123 a-big-file --mmap

参数说明:-g开启调用栈记录,-e minor-faults指定只追踪minor页错误事件。

  • 分析记录数据:
perf report

在报告中可以按函数名筛选,重点查看与munmap相关的调用链,确认它是否关联了minor page fault事件。

2. 用ftrace关联munmap调用与页错误

ftrace可细粒度追踪内核和用户态的函数调用,能明确两者的时序关系:

  • 先挂载debugfs(未挂载时执行):
mount -t debugfs none /sys/kernel/debug
  • 开启目标追踪事件:
echo 1 > /sys/kernel/debug/tracing/events/mm/minor_fault/enable
echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_munmap/enable
  • 启动追踪并执行测试命令:
echo 1 > /sys/kernel/debug/tracing/tracing_on
rg -j1 -F 123 a-big-file --mmap
echo 0 > /sys/kernel/debug/tracing/tracing_on
  • 查看追踪日志:
cat /sys/kernel/debug/tracing/trace

通过进程PID匹配munmap调用和minor page fault事件,判断是否存在因果关联。

3. 用gdb断点调试定位用户态代码

如果问题出在用户态逻辑,gdb能精准定位代码行:

  • 启动gdb加载rg:
gdb rg
  • 在munmap处设断点:
break munmap
  • 运行测试命令:
run -j1 -F 123 a-big-file --mmap
  • 触发断点时查看调用栈:
bt

还可配合perf stat在调试过程中实时统计页错误,或设置watchpoint监控映射内存区域的变化。

4. 用perf probe追踪内核态munmap逻辑

若怀疑内核处理munmap时触发页错误,可添加内核探针:

  • 给内核munmap函数添加探针(需安装对应内核的调试包):
perf probe -x /usr/lib/debug/lib/modules/$(uname -r)/vmlinux munmap
  • 记录探针事件与minor页错误:
perf record -g -e probe:munmap -e minor-faults rg -j1 -F 123 a-big-file --mmap
  • 分析报告,查看内核munmap调用与页错误的关联细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:57:49