如何计算mmap-ed内存中的缓存未命中(使用eBPF)



我想获取时间序列

t0, misses
...
tN, misses

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

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

尝试将perf record用于类似的目的:我不喜欢记录的数据量。我记得当时的尝试是这样的(我也不记得我是如何解析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-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/)有CCD_ 10可以将mmap syscalls和page_fault_user都记录到perf.data中,CCD_。

关于性能和跟踪的一些有用链接:http://www.brendangregg.com/perf.htmlhttp://www.brendangregg.com/ebpf.htmlhttps://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   

最新更新