一、依赖的库:
1、zlib:
2、elfutils:
3、binutils:
二、修改kernel:
1、kernel/tools/perf/Makefile.perf文件:
EXTRA_CFLAGS=-I/data/luwei/others/perf/elfutils-0.188/output/include -L/data/luwei/others/perf/elfutils-0.188/output/lib -I/data/luwei/others/perf/binutils-2.28.1/output/include -L/data/luwei/others/perf/binutils-2.28.1/output/lib
WERROR=0
NO_LIBPERL=1
NO_LIBPYTHON=1
最开头增加上面的信息;
2、kernel/tools/lib/bpf/Makefile文件:
INCLUDES增加-I/data/luwei/others/perf/elfutils-0.188/output/include
3、tools/lib/traceevent/Makefile文件:
找到
$(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\,
将其注释,在下一行添加
$(NM) -u -D $1 | awk -F '[ |\t|@]+' 'NF>1 {print "\t"$$3";"}' | sort -u;\
4、将elfutils中编译出来的libelf.so去掉,使其链接的时候使用libelf.a静态库;
5、交叉编译perf:
make -f Makefile.perf perf ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabi-
6、strip perf:
最终得到perf。
三、内核支持pmu性能:
dts中增加compatible = "arm,cortex-a17-pmu"的pmu设备节点,我们使用rk3568的armv7(a17核),使perf支持硬件pmu特性:
---------------------------------------------------------------------------------------------------------------------------------
1、分支预测相关事件:
br_immed_retired:已退休的立即分支指令数量(直接跳转指令)。
br_mis_pred:分支预测错误的次数。
br_pred:分支预测的总次数(包括正确和错误)。
br_return_retired:已退休的函数返回指令数量(如 BX LR)。
这些事件用于分析分支预测器的效率。例如,高 br_mis_pred 可能表明分支预测逻辑需要优化。
2、总线与内存访问事件:
bus_access:总线访问次数。
bus_cycles:总线活跃周期数。
mem_access:内存访问次数。
memory_error:内存访问错误次数(如对齐错误)。
用于监控内存子系统的性能瓶颈或错误。
3、指令执行事件:
cpu_cycles:CPU 总周期数(衡量 CPU 负载)。
inst_retired:已退休的指令总数。
inst_spec:推测执行的指令数(可能被丢弃)。
ld_retired:已退休的加载指令数。
st_retired:已退休的存储指令数。
unaligned_ldst_retired:未对齐的加载/存储指令。
反映 CPU 的指令吞吐量和执行效率。
4、缓存相关事件:
1)、L1 数据缓存:
l1d_cache:L1 数据缓存访问次数。
l1d_cache_refill:L1 数据缓存未命中后从下级缓存/内存填充的次数。
l1d_cache_wb:L1 数据缓存写回次数。
l1d_tlb_refill:L1 数据 TLB 未命中后填充的次数。
2)、L1 指令缓存:
l1i_cache:L1 指令缓存访问次数。
l1i_cache_refill:L1 指令缓存未命中后填充的次数。
l1i_tlb_refill:L1 指令 TLB 未命中后填充的次数。
3)、L2 缓存:
l2d_cache:L2 数据缓存访问次数。
l2d_cache_refill:L2 数据缓存未命中后填充的次数。
l2d_cache_wb:L2 数据缓存写回次数。
用于分析缓存命中率和内存延迟问题。
5、其他事件:
cid_write_retired:已退休的上下文 ID 写入指令数(如 MCR 操作)。
exc_return:异常返回指令数。
exc_taken:异常触发次数。
pc_write_retired:已退休的程序计数器(PC)写入指令数(如分支、跳转)。
sw_incr:软件递增的计数器事件(自定义用途)。
ttbr_write_retired:已退休的页表基址寄存器(TTBR)写入指令数。
示例:
1、监视ls命令L1数据缓存未命中率:
./perf stat -e l1d_cache_refill,l1d ls
-------------------------------------------------------------
imgs_temp lost+found perf ramdisk_version t
Performance counter stats for 'ls':
13967 l1d_cache_refill
381038 l1d
0.004646833 seconds time elapsed
0.005158000 seconds user
0.000000000 seconds sys
2、监视ls命令总线访问事务:
./perf stat -e bus_access,bus_cycles,mem_access,memory_error ls
------------------------------------------------------------------------------
imgs_temp lost+found perf ramdisk_version t
Performance counter stats for 'ls':
416874 bus_access
4454528 bus_cycles
548408 mem_access
0 memory_error
0.004426625 seconds time elapsed
0.002468000 seconds user
0.002468000 seconds sys
3、perf性能分析:
./perf top -e cpu-clock -p 353
分析进程353的cpu使用。
1万+

被折叠的 条评论
为什么被折叠?



