首页 > 解决方案 > 如何计算 mmap 内存中的缓存未命中(使用 eBPF)?

问题描述

我想获得时间序列

t0, misses
...
tN, misses

其中tN是时间戳(秒分辨率),misses是内核为我的 PID 进行磁盘 IO 以mmap()在进程确实访问该内存时加载 -ed 内存区域的缺失页面的次数。好的,也许磁盘 IO 和内存访问之间的连接更难跟踪,假设我的程序不能用另一个原因(而不是评估丢失的 mmapped 内存)做任何磁盘 io。我想,我需要追踪一个叫做node-load-missesperf world 的东西。

任何想法如何使用 eBPF 来收集此类数据?我应该使用什么探头?

尝试perf record用于类似目的:我不喜欢记录多少数据。我记得尝试是这样的(我也不记得我是如何解析那个 output.data 文件的):

perf record -p $PID -a -F 10 -e node-loads -e node-load-misses -o output.data

我认为 eBPF 可以提供一些便利,以更少的开销方式实现这样的事情。

标签: mmapperfebpf

解决方案


加载内存中不存在的映射页面不是像 perf's cache-missesor node-loadsor那样的硬件事件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.pyhttps://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   

推荐阅读