如何计算mmap-ed内存中的高速缓存未命中使用eBPF?

问题描述

我想获取时间序列

t0,misses
...
tN,misses

其中tN是时间戳(秒分辨率),misses是内核为我的PID制作磁盘IO以加载mmap()版的缺少页面次数进程访问该内存时的内存区域。好的,也许磁盘IO和内存访问之间的连接更难跟踪,让我们假设我的程序无法使用其他原因(而不是评估丢失的映射内存)来做任何磁盘。我想,我需要在性能世界中追踪一个叫做node-load-misses的东西。

有什么想法可以使用eBPF收集此类数据吗?我应该使用哪些探针?

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

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

我认为eBPF可以提供一些设施,以较少的开销来实现这种事情。

解决方法

加载内存中不存在的mmaped页面不是硬件事件,例如perf的cache-missesnode-loadsnode-load-misses。当您的程序评估为不存在内存地址时,GPFault / pagefault异常由硬件生成,并且由Linux内核代码在软件中处理。对于首次访问匿名内存,将为该虚拟地址分配并映射物理页面;将启动用于访问mmaped文件磁盘的I / O。 linux中有两种页面错误:次要页面错误和主要页面错误,而磁盘I / O是主要页面错误。

您应尝试使用trace-cmd或ftrace或perf跟踪。错误跟踪was planned for perf tool in 2012和补丁的支持在https://lwn.net/Articles/602658/

中提出

在用户空间代码中有一个页面错误的跟踪点,此命令将打印一些事件,这些事件的内存地址为页面错误:

echo 2^123456%2 | perf trace -e 'exceptions:page_fault_user' bc

使用最新的性能工具(https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/),perf trace record可以将mmap syscall和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 并且某些密件抄送工具可用于跟踪磁盘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