我想获取时间序列
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-misses
、node-loads
或node-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