事件分为三种:

  1. Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
  2. Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
  3. 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指令上做优化:简化调用关系,减少冗余代码(即不是必须存在的的代码),减小代码量,减少不必要的调用;如:

      1. for i=1..n
      2. for j=1..n
      3. for k=1..n
      4. c[i,j] += a[i,k]*b[k,j]
      1. for i=1..n
      2. for k=1..n
      3. for j=1..n
      4. c[i,j] += a[i,k]*b[k,j]

      图片.png

    • 在cache层面上,代码二要比代码一效率高很多,因为代码2的b[k,j]是按行访问的,所以存在良好的空间局部性,cache line被充分利用。代码1中,b [k,j]由列访问。 由于行的存储矩阵,因此对于每个缓存行加载,只有一个元素用于遍历。

    • 更多优化细节可查看本拦下的cache优化基础文档。
    • 相关优化可参考:
  • branch-instructions: 分支预测成功次数
  • branch-misses: 分支预测失败次数
    • 分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。
    • 条件分支通常有两路后续执行分支,not token时,跳过接下来的JMP指令,继续执行, token时,执行JMP指令,跳转到另一块程序内存去执行。
    • 图片.png
    • 加入分支预测器后,为避免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

优化参考:
http://blog.chinaunix.net/uid-7319742-id-2059720.html