【问题标题】:How to count cache-misses in mmap-ed memory (using eBPF)?如何计算 mmap 内存中的缓存未命中(使用 eBPF)?
【发布时间】:2020-09-07 19:58:48
【问题描述】:

我想获得时间序列

t0, misses
...
tN, misses

其中tN 是时间戳(秒分辨率),misses 是内核为我的 PID 进行磁盘 IO 以在进程确实访问时加载 mmap()-ed 内存区域的缺失页面的次数到那个记忆。好的,也许磁盘 IO 和内存访问之间的连接更难跟踪,让我们假设我的程序不能用另一个(而不是评估丢失的 mmapped 内存)原因来做任何磁盘 io。我想,我需要在 perf world 中跟踪一个名为 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 可以提供一些便利,以更少的开销方式实现这样的事情。

【问题讨论】:

  • Pavelkolodin、cache-misses 或 node-* 事件不适用于磁盘 IO 事件。这些未命中是 CPU 管道和 L2/L3/NUMA 内存硬件计数器;并且磁盘 I/O (如加载丢失的页面)是由 Linux 内核在软件中处理的 pagefault(这可作为软件事件 perf record -e page-faults 获得)。您应该尝试跟踪(trace-cmd 或 ftrace 或 perf trace -e 'exceptions:page_fault_user')。故障追踪was planned for perf tool in 2012,补丁在lwn.net/Articles/602658提出

标签: mmap perf ebpf


【解决方案1】:

加载内存中不存在的 mmaped 页面不是像 perf 的 cache-missesnode-loadsnode-load-misses 这样的硬件事件。当您的程序评估不存在的内存地址时,GPFault/pagefault 异常由硬件生成,并由 Linux 内核代码在软件中处理。对于第一次访问匿名内存,物理页面将被分配并映射到这个虚拟地址;用于访问 mmaped 文件的磁盘 I/O 将被启动。 linux中的page fault有minor和major两种,disk I/O是major page fault。

您应该尝试使用 trace-cmd 或 ftrace 或 perf trace。支持故障追踪was planned for perf tool in 2012,补丁在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.htmlhttp://www.brendangregg.com/ebpf.htmlhttps://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   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 2019-07-28
    • 2021-01-20
    • 2021-01-24
    • 1970-01-01
    • 2014-09-29
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多