mmap - 如何计算 mmap 内存中的缓存未命中(使用 eBPF)?
问题描述
我想获得时间序列
t0, misses
...
tN, misses
其中tN
是时间戳(秒分辨率),misses
是内核为我的 PID 进行磁盘 IO 以mmap()
在进程确实访问该内存时加载 -ed 内存区域的缺失页面的次数。好的,也许磁盘 IO 和内存访问之间的连接更难跟踪,假设我的程序不能用另一个原因(而不是评估丢失的 mmapped 内存)做任何磁盘 io。我想,我需要追踪一个叫做node-load-misses
perf world 的东西。
任何想法如何使用 eBPF 来收集此类数据?我应该使用什么探头?
尝试perf record
用于类似目的:我不喜欢记录多少数据。我记得尝试是这样的(我也不记得我是如何解析那个 output.data 文件的):
perf record -p $PID -a -F 10 -e node-loads -e node-load-misses -o output.data
我认为 eBPF 可以提供一些便利,以更少的开销方式实现这样的事情。
解决方案
加载内存中不存在的映射页面不是像 perf's cache-misses
or node-loads
or那样的硬件事件node-load-misses
。当您的程序评估不存在的内存地址时,GPFault / pagefault异常由硬件生成,并由 Linux 内核代码在软件中处理。对于第一次访问匿名内存,物理页面将被分配并映射到这个虚拟地址;用于访问 mmaped 文件的磁盘 I/O 将被启动。linux中的page fault有minor和major两种,disk I/O是major page fault。
您应该尝试使用 trace-cmd 或 ftrace 或 perf trace。2012 年计划对 perf 工具支持故障跟踪,并在https://lwn.net/Articles/602658/中提出了补丁
来自用户空间代码的页面错误跟踪点,此命令打印一些带有页面错误内存地址的事件:
echo 2^123456%2 | perf trace -e 'exceptions:page_fault_user' bc
使用最近的 perf 工具(https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/)perf trace record
可以将 mmap 系统调用和 page_fault_user 记录到 perf.data 中,perf script
并将打印所有事件,它们可以由一些 awk 或 python 脚本计算。
关于性能和跟踪的一些有用链接:http ://www.brendangregg.com/perf.html http://www.brendangregg.com/ebpf.html https://github.com/iovisor/bpftrace/blob/master/ INSTALL.md 还有一些 bcc 工具可以用来跟踪磁盘 I/O,比如https://github.com/iovisor/bcc/blob/master/examples/tracing/disksnoop.py或https://github.com/ brendangregg/perf-tools/blob/master/examples/iosnoop_example.txt
对于简单的时间序列统计,您可以使用perf stat -I 1000
带有正确软件事件的命令
perf stat -e cpu-clock,page-faults,minor-faults,major-faults -I 1000 ./program
...
# time counts unit events
1.000112251 413.59 msec cpu-clock # 0.414 CPUs utilized
1.000112251 5,361 page-faults # 0.013 M/sec
1.000112251 5,301 minor-faults # 0.013 M/sec
1.000112251 60 major-faults # 0.145 K/sec
2.000490561 16.32 msec cpu-clock # 0.016 CPUs utilized
2.000490561 1 page-faults # 0.005 K/sec
2.000490561 1 minor-faults # 0.005 K/sec
2.000490561 0 major-faults # 0.000 K/sec
推荐阅读
- git - Gitlab-CE 中的开发人员和维护人员权限正在实现自动合并
- json - 如何使用 python json.loads 处理 json 日期中的“\”
- c++ - 为什么ffmpeg解码的图片有边框?
- google-console-developer - 无论如何在发布之前上传应用程序以在谷歌播放控制台上重新查看?
- sql - 在 SQL 数据库中存储数组的最佳方式是什么?
- sql - 将字符串转换为 DateTime 并在 Where 子句中使用转换 - DateDiff
- django - 如何使用嵌套序列化来序列化和反序列化数据?django-rest-framework
- sql - 将具有重复列的多行分散到postgresql中的单个唯一行
- modelica - 如何在 dymola 2020X 中旋转或翻转组件
- php - 如何从 laravel 护照令牌中获取用户 ID?