perf 统计 内存相关event
perf 可探测 的所有 event ,均可以使用命令perf list
获得。
本文举几个和内存相关的性能的几个event例子
探测 进程 的缺页中断数(page fault)
perf stat -e faults ./mem
能够统计 ./mem 执行 周期内,引发的 缺页中断数。
Performance counter stats for './mem':
100,126 faults
0.203315268 seconds time elapsed
探测正在运行的进程,则使用
perf stat -e faults -p $PID
运行,命令掐断后,打印出命令开始到命令结束时,目标进程的缺页中断数。
可以 使用 perf record
来探测 指定 event 的热点函数,例如
perf record -e faults ./mem
使用
perf report
输出结果。
Samples: 655 of event 'faults', Event count (approx.): 100151
Overhead Command Shared Object Symbol
99.57% mem mem [.] func
0.35% mem ld-2.17.so [.] _dl_lookup_symbol_x
0.06% mem ld-2.17.so [.] _dl_important_hwcaps
0.01% mem ld-2.17.so [.] _dl_start
0.00% mem ld-2.17.so [.] _start
0.00% mem [kernel.vmlinux] [k] __clear_user
0.00% mem [kernel.vmlinux] [k] copy_user_enhanced_fast_string
原理
在内核缺页中断处,有perf的钩子,用于统计缺页中断的次数:
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
内核源码中搜索 PERF_COUNT_SW_PAGE_FAULTS
即可。
探测 进程 TLB相关event
perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses,L1-icache-load-misses ./mem
或者指定进程id进行探测
perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses,L1-icache-load-misses -p $PID
$perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses,L1-icache-load-misses ./mem
Performance counter stats for './mem':
89,946,326 dTLB-loads (80.09%)
17,030 dTLB-load-misses # 0.02% of all dTLB cache hits (40.47%)
10 iTLB-loads (39.96%)
137 iTLB-load-misses # 1370.00% of all iTLB cache hits (59.80%)
98,113 L1-icache-load-misses (79.65%)
0.201743107 seconds time elapsed
因为是 硬件event,所以不同的CPU架构,这些值代表的不一样。一样的是,dTLB代表了数据的TLB统计,iTLB代表的是指令的TLB统计。
相关 参考文档:http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html