cache miss perf

perf stat -r 5 -e cache-misses,cache-references,instructions,cycles,L1-dcache-stores,L1-dcache-store-misses   -a
perf record -e cache-misses

 其实一般使用perf stat 从整体看看程序运行时各种统计事件的大概,再针对某些方向深入细节。有些程序慢是因为计算量太大,多数时间都消耗在CPU计算上,这叫做CPU bound型;有些程序慢是因为过多的IO,此种情况CPU利用率并不高,这叫做IO bound型;对于CPU bound程序的调优和IO bound程序的调优是不同的。

 perf stat ./t1

 Performance counter stats for './t1':

        266.995961 task-clock                #    1.000 CPUs utilized          
                 0 context-switches          #    0.000 M/sec                  
                 0 CPU-migrations            #    0.000 M/sec                  
               259 page-faults               #    0.001 M/sec                  
       745,031,432 cycles                    #    2.790 GHz                    
     <not counted> stalled-cycles-frontend 
     <not counted> stalled-cycles-backend  
       553,285,973 instructions              #    0.74  insns per cycle        
       110,589,146 branches                  #  414.198 M/sec                  
            16,657 branch-misses             #    0.02% of all branches        

       0.266944803 seconds time elapsed

上面告诉我们,t1是CPU bound型,因为task-clock为1。
对t1调试应该要找到热点(即最耗时的代码片段),再看看是否能够提高热点代码的效率。缺省情况下,除task-clock之外,perf stat还会给出其他几个常用的统计信息:

  • task-clock-msecs:CPU利用率,此值越高说明程序的多数时间花费在CPU计算上而非IO;
  • context-switches:进程切换次数,记录程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的;
  • cache-misses:程序运行过程中总体的cache利用情况,如果该值过高,说明程序的cache利用不好;
  • CPU-migrations:表示进程t1运行过程中发生了多少次CPU迁移,即被调度器从一个CPU转移到另外一个CPU上运行;
  • cycles:处理器时钟,一条指令可能需要多个cycles;
  • instructions:机器指令数目;
  • IPC:instructions/cycles的比值,该值越大越好,说明程序充分利用了处理器的特性;
  • cache-references:cache命中的次数;
  • cache-misses:cache失效的次数;

通过-e选项,可以改变perf stat的缺省事件(perf list查看),perf stat -h查看帮助信息:

 perf stat -p $pid -d     #进程级别统计
 perf stat -a -d sleep 5  #系统整体统计
 perf stat -p $pid -e 'syscalls:sys_enter' sleep 10  #分析进程调用系统调用的情形
 perf stat -a sleep 5 #收集整个系统的性能计数,持续5秒
 perf stat -C 0  #统计CPU 0的信息

 

perf sched

perf sched专门用于跟踪/测量调度器,包括延时等。

perf sched record :录制测试过程中的调度事件

perf sched latency:报告线程调度延时和其他调度相关属性

perf sched script:查看执行过程中详细的trace信息

perf sched replay:回放perf sched record录制的执行过程

perf sched map:用字符表示打印上下文切换

执行sudo perf sched record ls后,通过不同方式查看结果。

perf bench

perf bench作为benchmark工具的通用框架,包含sched/mem/numa/futex等子系统,all可以指定所有。

perf bench可用于评估系统sched/mem等特定性能。

perf bench sched:调度器和IPC机制。包含messaging和pipe两个功能。
perf bench mem:内存存取性能。包含memcpy和memset两个功能。
perf bench numa:NUMA架构的调度和内存处理性能。包含mem功能。
perf bench futex:futex压力测试。包含hash/wake/wake-parallel/requeue/lock-pi功能。
perf bench all:所有bench测试的集合

perf bench futex

Futex是一种用户态和内核态混合机制,所以需要两个部分合作完成,linux上提供了sys_futex系统调用,对进程竞争情况下的同步处理提供支持。

所有的futex同步操作都应该从用户空间开始,首先创建一个futex同步变量,也就是位于共享内存的一个整型计数器。

当进程尝试持有锁或者要进入互斥区的时候,对futex执行"down"操作,即原子性的给futex同步变量减1。如果同步变量变为0,则没有竞争发生, 进程照常执行。

如果同步变量是个负数,则意味着有竞争发生,需要调用futex系统调用的futex_wait操作休眠当前进程。

当进程释放锁或 者要离开互斥区的时候,对futex进行"up"操作,即原子性的给futex同步变量加1。如果同步变量由0变成1,则没有竞争发生,进程照常执行。

如果加之前同步变量是负数,则意味着有竞争发生,需要调用futex系统调用的futex_wake操作唤醒一个或者多个等待进程。




posted @ 2022-10-14 22:16  codestacklinuxer  阅读(97)  评论(0)    收藏  举报