一、list帮助文档
输入命令:./simpleperf help list
Usage: simpleperf list [options] [hw|sw|cache|raw|tracepoint]
List all available event types.
Filters can be used to show only event types belong to selected types:
hw hardware events
sw software events
cache hardware cache events
raw raw cpu pmu events
tracepoint tracepoint events
cs-etm coresight etm instruction tracing events
二、事件分类
基于性能分析,可以进行算法优化(空间复杂度和时间复杂度权衡)、代码优化(提高执行速度、减少内存占用)。
评估程序对硬件资源的使用情况,例如各级cache的访问次数、各级cache的丢失次数、流水线停顿周期、前端总线访问次数等。
评估程序对操作系统资源的使用情况,系统调用次数、上下文切换次数、任务迁移次数。
1. hw hardware events
Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
2. sw software events
Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。
3. tracepoint tracepoint events
tracepoints是散落在内核源码中的一些hook,它们可以在特定的代码被执行到时触发,这一特定可以被各种trace/debug工具所使用。
Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节,比如slab分配器的分配次数等。
三、分析重要事件
- cache相关
branch-load-misses |
分支预测读取失败次数 |
branch-loads |
分支预测读取次数 |
branch-store-misses |
分支预测写入失败次数 |
branch-stores |
分支预测写入次数 |
L1-dcache-load-misses |
一级数据缓存读取失败次数 |
L1-dcache-loads |
一级数据缓存读取次数 |
L1-dcache-store-misses |
一级数据缓存写入失败次数 |
L1-dcache-stores |
一级数据缓存写入次数 |
cache-misses |
cache 失效的次数 |
cache-references |
cache 命中的次数 |
raw-l1d-cache |
1级数据缓存访问 |
raw-l1d-cache-allocate |
Attributable Level 1 data cache allocation without refill |
raw-l1d-cache-inval |
无效的可归属的一级数据缓存 |
raw-l1d-cache-lmiss-rd |
一级数据高速缓存长时读取未命中 |
raw-l1d-cache-rd |
读取一级数据缓存 |
raw-l1d-cache-refill |
一级数据缓存重新填充 |
raw-l1d-cache-refill-inner |
归因一级数据缓存重新填充,内部 |
raw-l1d-cache-refill-outer |
归因一级数据缓存重新填充,外部 |
raw-l1d-cache-refill-rd |
归因一级数据缓存重新填充,读取 |
raw-l1d-cache-refill-wr |
归因一级数据缓存重新填充,写入 |
raw-l1d-cache-wb |
归因于一级数据缓存写回 |
raw-l1d-cache-wb-clean |
一级数据缓存回写,清理和一致性 |
raw-l1d-cache-wb-victim |
归因一级数据高速缓存写回,受害者 |
raw-l1d-cache-wr |
归因一级数据缓存访问,写入 |
raw-l1i-cache |
归因一级指令缓存访问 |
raw-l1i-cache-lmiss |
一级指令高速缓存长时间未命中 |
raw-l1i-cache-refill |
一级指令高速缓存重新填充 |
raw-l2d-cache |
二级数据缓存访问 |
raw-l2d-cache-allocate |
Attributable Level 2 data cache allocation without refill |
raw-l2d-cache-inval |
无效的可归属的二级数据缓存 |
raw-l2d-cache-lmiss-rd |
二级数据高速缓存长时读取未命中 |
raw-l2d-cache-rd |
读取二级数据缓存 |
raw-l2d-cache-refill |
二级数据缓存重新填充 |
raw-l2d-cache-refill-rd |
归因二级数据缓存重新填充,读取 |
raw-l2d-cache-refill-wr |
归因二级数据缓存重新填充,写入 |
raw-l2d-cache-wb |
归因于二级数据缓存写回 |
raw-l2d-cache-wb-clean |
二级数据缓存回写,清理和一致性 |
raw-l2d-cache-wb-victim |
归因二级数据高速缓存写回,受害者 |
raw-l2d-cache-wr |
归因二级数据缓存访问,写入 |
raw-l2i-cache |
归因二级指令缓存访问 |
raw-l2i-cache-lmiss |
二级指令高速缓存长时间未命中 |
raw-l2i-cache-refill |
二级指令缓存重新填充 |
raw-l3d-cache |
三级数据缓存访问 |
raw-l3d-cache-allocate |
归因三级数据或统一缓存分配而无需重新填充 |
raw-l3d-cache-inval |
归因3级数据或统一缓存访问,无效 |
raw-l3d-cache-lmiss-rd |
3级数据高速缓存长时读取未命中 |
raw-l3d-cache-rd |
读取二级数据缓存 |
raw-l3d-cache-refill |
二级数据缓存重新填充 |
raw-l3d-cache-refill-rd |
归因3级数据或统一缓存重新填充,已读取 |
raw-l3d-cache-refill-wr |
归因于3级数据或统一缓存重新填充,写入 |
raw-l3d-cache-wb |
归因于3级数据或统一缓存回写 |
raw-l3d-cache-wb-clean |
归因于3级数据或统一缓存回写,缓存清除 |
raw-l3d-cache-wb-victim |
归因于第3级数据或统一高速缓存写回,受害者 |
raw-l3d-cache-wr |
归因于3级数据或统一缓存访问,写入 |
raw-ll-cache |
可归因的末级数据缓存访问 |
raw-ll-cache-miss |
归因于末级数据或统一高速缓存未命中 |
raw-ll-cache-miss-rd |
归因于末级缓存读取未命中 |
raw-ll-cache-rd |
归因于末级缓存读取 |
- branch相关
branch-load-misses |
分支预测读取失败次数 |
branch-loads |
分支预测读取次数 |
branch-store-misses |
分支预测写入失败次数 |
branch-stores |
分支预测写入次数 |
branch-misses |
分支预测失败的次数 |
raw-br-immed-retired |
体系结构上执行的指令,立即分支 |
raw-br-immed-spec |
分支以推测方式执行,立即分支 |
raw-br-indirect-spec |
推测执行的分支,间接分支 |
raw-br-mis-pred |
预测错误或未预测的分支 |
raw-br-mis-pred-retired |
体系结构上执行的指令,预测错误分支 |
raw-br-pred |
可预测的分支推测执行 |
raw-br-retired |
指令架构上执行的指令,分支 |
raw-br-return-retired |
在体系结构上执行指令,条件代码检查通过,过程返回 |
raw-br-return-spec |
分支被推测执行,过程返回 |
- TLB
page-faults |
缺页异常的次数 |
raw-dtlb-walk |
归因指令TLB访问(至少有一个translation table walk) |
raw-itlb-walk |
归因数据或统一的TLB访问(至少有一个translation table walk) |
raw-l1d-tlb |
归因于1级数据或统一的TLB访问 |
raw-l1d-tlb-rd |
归因于1级数据或统一的TLB访问,已读取 |
raw-l1d-tlb-refill |
归因于1级数据的TLB重新填充 |
raw-l1d-tlb-refill-rd |
归因于1级数据的TLB重新填充,已读取 |
raw-l1d-tlb-refill-wr |
归因于1级数据的TLB重新填充,已写入 |
raw-l1d-tlb-wr |
归因于1级数据或统一的TLB访问,写入 |
raw-l1i-tlb |
归因于1级指令缓存访问 |
raw-l1i-tlb-refill |
归因于1级数据或统一的TLB访问,已读取 |
raw-l2d-tlb |
归因于2级数据或统一的TLB访问 |
raw-l2d-tlb-rd |
归因于2级数据或统一的TLB访问,已读取 |
raw-l2d-tlb-refill |
可归因的2级数据或统一的TLB重新填充 |
raw-l2d-tlb-refill-rd |
归因于2级数据或统一的TLB重新填充,已读取 |
raw-l2d-tlb-refill-wr |
归因于2级数据或统一的TLB重新填充,写入 |
raw-l2d-tlb-wr |
归因于2级数据或统一的TLB访问,写入 |
raw-l2i-tlb |
归因于2级指令的TLB访问 |
raw-l2i-tlb-refill |
归因于2级指令的TLB重新填充 |
当应用程序请求的页面尚未建立、请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系尚未建立时,都会触发一次缺页异常。另外TLB不命中,页面访问权限不匹配等情况也会触发缺页异常。
Translation Table Walk:
- pipeline
- memory
raw-mem-access |
数据存储器访问 |
raw-mem-access-rd |
数据存储器访问,读取 |
raw-mem-access-wr |
数据存储器访问,写入 |
raw-memory-error |
本地内存错误 |
翻译部分有错误,未完待续。。。