为何使用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
相关产品推荐
相关产品推荐

