事件分为三种:
- Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
- Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
- Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节,比如slab分配器的分配次数等。
[Hardware event] :
- cpu-cycles:统计cpu周期数,用于性能的耗时分析。
cpu周期:指一条指令的操作时间。(不同于cpu-clock,是硬件事件)
- instructions: 机器指令数目,一条指令会包含多个cycles
- cache-references: cache命中次数
cache-misses: cache失效次数,过多的实效会增加IO时间,增加耗时。
- 当运算器需要从存储器中提取数据时,它首先在最高级的cache中寻找然后在次高级的cache中寻找。如果在cache中找到,则称为命中hit;反之,则称为不命中miss。
- 为L1L2L3失效的统计和,具体哪个寄存器的可在Hardware cache event中检测。
- 优化:程序在一段时间内访问的数据通常具有局部性,比如对一维数组来说,访问了地址x上的元素,那么以后访问地址x+1、x+2上元素的可能性就比较高;现在访问的数据,在不久之后再次被访问的可能性也比较高。局部性分为“时间局部性”和“空间局部性”,时间局部性是指当前被访问的数据随后有可能访问到;空间局部性是指当前访问地址附近的地址可能随后被访问。处理器通过在内存和核心之间增加缓存以利用局部性增强程序性能,这样可以用远低于缓存的价格换取接近缓存的速度。
从cache指令上做优化:简化调用关系,减少冗余代码(即不是必须存在的的代码),减小代码量,减少不必要的调用;如:
for i=1..n
for j=1..n
for k=1..n
c[i,j] += a[i,k]*b[k,j]
for i=1..n
for k=1..n
for j=1..n
c[i,j] += a[i,k]*b[k,j]
在cache层面上,代码二要比代码一效率高很多,因为代码2的b[k,j]是按行访问的,所以存在良好的空间局部性,cache line被充分利用。代码1中,b [k,j]由列访问。 由于行的存储矩阵,因此对于每个缓存行加载,只有一个元素用于遍历。
- 更多优化细节可查看本拦下的cache优化基础文档。
- 相关优化可参考:
- https://blog.csdn.net/yaolanshu_June/article/details/79047302?ops_request_misc=&request_id=&biz_id=102&utm_term=cache%20misses&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-79047302.142^v7^pc_search_result_control_group,157^v4^control&spm=1018.2226.3001.4187
- https://blog.csdn.net/wangjiaoyu250/article/details/9212863
- https://coolshell.cn/articles/10249.html
- branch-instructions: 分支预测成功次数
- branch-misses: 分支预测失败次数
- 分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。
- 条件分支通常有两路后续执行分支,not token时,跳过接下来的JMP指令,继续执行, token时,执行JMP指令,跳转到另一块程序内存去执行。
- 加入分支预测器后,为避免pipeline停顿(stream stalled),其会猜测两路分支哪一路最有可能执行,然后投机执行,如果猜错,则流水线中投机执行中间结果全部抛弃,重新获取正确分支路线上的指令执行。可见,错误的预测会导致程序执行的延迟。
- 优化:详见本栏下的branch优化文档
- bus-cycles
- stalled-cycles-frontend OR idle-cycles-frontend
- stalled-cycles-backend OR idle-cycles-backend
- ref-cycles
[Software event] :
- cpu-clock: cpu clock的统计,每个cpu都有一个高精度定时器,单位为ms。
- task-clock :cpu clock中有task运行的统计
- cpu-migrations:进程运行过程中从一个cpu迁移到另一cpu的次数
- context-switches: 上下文切换次数,
- page-faults: 页错误的统计
- major-faults:页错误,内存页已经被swap到硬盘上,需要I/O换回
- minor-faults :页错误,内存页在物理内存中,只是没有和逻辑页进行映射
- alignment-faults: 统计内存对齐错误发生的次数, 当访问的非对齐的内存地址时,内核会进行处理,已保存不会发生问题,但会降低性能
- emulation-faults
[Hardware cache event] :
- L1-dcache-loads
- L1-dcache-load-misses
- L1-dcache-stores
- […] rNNN
[Tracepoint event] :
- probe:tcp_sendmsg
- sched:sched_process_exec
- sched:sched_process_fork
- sched:sched_process_wait
- sched:sched_wait_task
- sched:sched_process_exit