Linux性能分析工具-Perf基本使用

By | 2018年3月13日
  1. 什么是Perf
    Perf是Linux下进行软件性能分析的工具,在Linux kernel 2.6.31中首次亮相,此后成为内核开发中最活跃的领域之一。
    Perf将Linux性能测量中CPU的硬件差异抽象出来并且提供了一个简单的命令行接口。
  2. 事件(Events)
    Perf支持一系列“可测量”的事件,Perf工具通过对这些可测量的事件的采样和统计来分析程序运行的细节,从而分析程序的性能或者瓶颈从而进行改进。
    这些可测量的事件可能来自不同的来源,比如:
    (1)来自kernel的一些计数器,比如content-switches,这些events称为software events;
    (2)来自处理器本身及其PMU(Performance Monitor Unit),这类来源提供了一系列用来测量微架构相关的事件,比如number of cycles, instruction retries,L 1 cache miss等等,这些events被称为PMU hardware events或者hardware events;
    (3)kernel perf_events接口也提供一小部分硬件事件,这些事件也被称为hardware events或者hardware cache events;(perf_events是Linux kernel提供的一个接口,它允许包括Perf在内的多种工具同时对某个CPU或者某个thread进行性能测量);
    (4)不同架构、不同内核版本所提供的事件类型可能不完全相同,可通过perf list命令查看本机支持的事件,以笔者的为例(Ubuntu 16.04.4,内核版本4.4.0), perf list的部分结果如下:

    perf list执行结果

  3. Perf 基本命令
    (1)perf list:上面已经介绍了,该命令可以列出所有支持的perf events;
    (2)perf stat:该命令通过概括精简的方式列出被调试程序的整体情况和汇总数据,假设有这样一段代码(来自https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html):
    //test.c

    void longa()
    {
      int i,j;
      for(i = 0; i < 1000000; i++)
      j=i; //am I silly or crazy? I feel boring and desperate.
    }
    void foo2()
    {
      int i;
      for(i=0 ; i < 10; i++)
           longa();
    }
    void foo1()
    {
      int i;
      for(i = 0; i< 100; i++)
         longa();
    }
    int main(void)
    {
      foo1();
      foo2();
    }

    将其编译成可执行文件gcc test.c -o test,下面列出了perf stat 对于test的输出:

    perf stat执行结果

    ps stat输出结果分析请参考http://blog.csdn.net/u011630575/article/details/66476165
    结果表明,该程序的task-clock为0.999,接近1,所以该程序多数时间花费在CPU计算上而非IO上;
    (3)perf top: 类似于Linux top命令,用于实时显示当前系统的性能统计信息,从中可以找到当前最耗时的内核函数或者用户程序;

    perf top执行结果

    (4)perf record,perf report:该命令可提供粒度更细的性能信息,比如究竟哪些代码占用CPU时间过长,以上面的test.c代码为例,对其可执行程序test执行
    perf record -e cpu-clock ./test
    该命令会在当前路径生成一个perf.data,
    然后执行
    perf report(可能会报以下错误:Kernel address maps (/proc/{kallsyms,modules}) were restricted,那么先执行sudo sh c ” echo 0> /proc/sys/kernel/kptr_restrict”

    从结果很容易看出该程序主要时间花费在longa函数上;

  4. 引用:
    https://perf.wiki.kernel.org/index.php/Main_Page
    https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
    https://perf.wiki.kernel.org/index.php/Tutorial
    http://blog.csdn.net/u011630575/article/details/66476165

发表评论

电子邮件地址不会被公开。 必填项已用*标注