Perf 是用来进行软件性能分析的工具。    通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。
    使用 perf,您可以分析程序运行期间发生的硬件事件,比如 instructions retired ,processor clock cycles 等;您也可以分析
软件事件,比如 Page Fault 和进程切换。
    这使得 Perf 拥有了众多的性能分析能力,举例来说,使用 Perf 可以计算每个时钟周期内的指令数,称为 IPC,IPC 偏低表明代码没有很好地利用 CPU。Perf 还可以对程序进行函数级别的采样,从而了解程序的性能瓶颈究竟在哪里等等。Perf 还可以替代 strace,可以添加动态内核 probe 点,还可以做 benchmark 衡量调度器的好坏。。。
2.perf 的基本使用
    1)使用 perf list 命令可以列出所有能够触发perf采样点的事件。
     $ perf list 
             List of pre-defined events (to be used in -e): 
             cpu-cycles OR cycles [Hardware event] 
             instructions [Hardware event] 
            …
             cpu-clock [Software event] 
             task-clock [Software event] 
             context-switches OR cs [Software event] 
            …
             ext4:ext4_allocate_inode [Tracepoint event] 
             kmem:kmalloc [Tracepoint event] 
             module:module_load [Tracepoint event] 
             workqueue:workqueue_execution [Tracepoint event] 
             sched:sched_{wakeup,switch} [Tracepoint event] 
             syscalls:sys_{enter,exit}_epoll_wait [Tracepoint event] 
    不同的系统会列出不同的结果,在 2.6.35 版本的内核中,该列表已经相当的长,但无论有多少,我们可以将它们划分为三类:
    Hardware Event 是由 PMU 硬件产生的事件,比如 cache 命中,当您需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样;
    Software Event 是内核软件产生的事件,比如进程切换,tick 数等 ;
    Tracepoint event 是内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 
slab分配器的分配次数等。上述每一个事件都可以用于采样,并生成一项统计数据。

2)perf stat的使用 
    有些程序慢是因为计算量太大,其多数时间都应该在使用 CPU 进行计算,这叫做 CPU bound 型;有些程序慢是因为过多的 IO,这种时候其CPU 利用率应该不高,这叫做 IO bound 型;对于 CPU bound 程序的调优和 IO bound 的调优是不同的。
    Perf stat 应该是您最先使用的一个工具。它通过概括精简的方式提供被调试程序运行的整体情况和汇总数据。
    现在将源码编译为可执行文件 t1
        gcc – o t1 – g test.c
    下面演示了 perf stat 针对程序 t1 的输出:
         $perf stat ./t1 
         Performance counter stats for './t1':

262.738415 task-clock-msecs # 0.991 CPUs 
         2 context-switches # 0.000 M/sec 
         1 CPU-migrations # 0.000 M/sec 
         81 page-faults # 0.000 M/sec 
         9478851 cycles # 36.077 M/sec (scaled from 98.24%) 
         6771 instructions # 0.001 IPC (scaled from 98.99%) 
         111114049 branches # 422.908 M/sec (scaled from 99.37%) 
         8495 branch-misses # 0.008 % (scaled from 95.91%) 
         12152161 cache-references # 46.252 M/sec (scaled from 96.16%) 
         7245338 cache-misses # 27.576 M/sec (scaled from 95.49%)

0.265238069 seconds time elapsed

上面告诉我们,程序 t1 是一个 CPU bound 型,因为 task-clock-msecs 接近 1。
    对 t1 进行调优应该要找到热点 ( 即最耗时的代码片段 ),再看看是否能够提高热点代码的效率。
    缺省情况下,除了 task-clock-msecs 之外,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 来查看 )。
假如您已经有很多的调优经验,可能会使用 -e 选项来查看您所感兴趣的特殊的事件。

3)Perf top 
    用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前
系统最耗时的内核函数或某个用户进程。
        举例说明: 一个死循环
            while (1) i++;
    我叫他 t2。启动 t2,然后用 perf top 来观察:
        下面是 perf top 的可能输出:
         PerfTop: 705 irqs/sec kernel:60.4% [1000Hz cycles] 
         -------------------------------------------------- 
         sampl pcnt function DSO 
         1503.00 49.2% t2 
         72.00 2.2% pthread_mutex_lock /lib/libpthread-2.12.so 
         68.00 2.1% delay_tsc [kernel.kallsyms] 
         55.00 1.7% aes_dec_blk [aes_i586] 
         55.00 1.7% drm_clflush_pages [drm] 
         52.00 1.6% system_call [kernel.kallsyms] 
         49.00 1.5% __memcpy_ssse3 /lib/libc-2.12.so 
         48.00 1.4% __strstr_ia32 /lib/libc-2.12.so 
         46.00 1.4% unix_poll [kernel.kallsyms] 
         42.00 1.3% __ieee754_pow /lib/libm-2.12.so 
         41.00 1.2% do_select [kernel.kallsyms] 
         40.00 1.2% pixman_rasterize_edges libpixman-1.so.0.18.0 
         37.00 1.1% _raw_spin_lock_irqsave [kernel.kallsyms] 
         36.00 1.1% _int_malloc /lib/libc-2.12.so 
         ^C
        很容易便发现 t2 是需要关注的可疑程序。不过其作案手法太简单:肆无忌惮地浪费着 CPU。所以我们不用再做什么其他的事情便可以找到问题所在。但现实生活中,影响性能的程序一般都不会如此愚蠢,所以我们往往还需要使用其他的 perf 工具进一步分析。
      通过添加 -e 选项,您可以列出造成其他事件的 TopN 个进程 / 函数。比如 -e cache-miss,用来看看谁造成的 cache miss 最多。
    4)使用 perf record, 解读 report
    使用 top 和 stat 之后,您可能已经大致有数了。要进一步分析,便需要一些粒度更细的信息。比如说您已经断定目标程序计算
量较大,也许是因为有些代码写的不够精简。那么面对长长的代码文件,究竟哪几行代码需要进一步修改呢?这便需要使用 perf 
record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。
    调优应该将注意力集中到百分比高的热点代码片段上,假如一段代码只占用整个程序运行时间的 0.1%,即使您将其优化到仅剩一条机器指令,恐怕也只能将整体的程序性能提高 0.1%。俗话说,好钢用在刀刃上,不必我多说了。
        仍以 t1 为例。
         perf record – e cpu-clock ./t1 
         perf report
    不出所料,hot spot 是xxx函数。但,代码是非常复杂难说的。自己写的一个程序居然有近一半的时间花费在 string 类的几个
方法上,string 是 C++ 标准,我绝不可能写出比 STL 更好的代码了。因此我只有找到自己程序中过多使用 string 的地方。因此我很需要按照调用关系(调用树)进行显示的统计信息。
        使用 perf 的 -g 选项便可以得到需要的信息:
         perf record – e cpu-clock – g ./t1 
         perf report
    通过对 calling graph 的分析,能很方便地看到时间都花费在那个函数中,从而针对函数进行相关优化。

perf-应用程序的调优与使用相关推荐

  1. CUDA程序性能调优

    目录 1.kernel function parameters 2. local variables 3.shared memory with __syncthreads__ call 4.devic ...

  2. spark算子_Spark 性能优化(四)——程序开发调优

    1.4 程序开发调优 Spark 性能优化的第一步,就是要在开发 Spark 作业的过程中注意和应用一些性能优化的基本原则.开发调优,就是要让大家了解以下一些 Spark 基本开发原则,包括:RDD ...

  3. 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例

    大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...

  4. java多线程程序性能调优 优化过程

    我, 一多年c++开发,由于项目原因需要对一个性能底下的多线程java程序进行调优,百度google了几把,妈蛋,没有发现指导如何java线程调优的文章啊,都是一些java使用规范,我去,那我大jav ...

  5. 面试官问我:平常如何对你的Java程序进行调优?

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:张俊城, 郭理勇, 刘建 来源:http://t.cn/AiCTERJz Java 应用性 ...

  6. 面试官问我:平常如何对你的 Java 程序进行调优?

    阅读本文大概需要 10 分钟. 作者:张俊城, 郭理勇, 刘建 来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器 ...

  7. java 暂停_面试官问我:平常如何对你的Java程序进行调优?

    java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着系 ...

  8. Java程序进行调优

    转载自:https://mp.weixin.qq.com/s/R-vxK7zAXhK-8qnDZCS56Q Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载 ...

  9. 定期存款单的mysql编写程序_MySQL 调优和使用必读

    MYSQL 应该是最流行了 WEB 后端数据库.WEB 开发语言最近发展很快,PHP, Ruby, Python, Java 各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是 ...

  10. [development][profile][dpdk] KK程序性能调优

    KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项de ...

最新文章

  1. python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例
  2. 要想工作效率高,我们到底需要多少睡眠?
  3. yum mysql 5.1 innodb_Yum升级mysql5.1到5.6
  4. 使用Python爬虫爬取网络美女图片
  5. Flask实现发送邮件功能
  6. 论文阅读-可变形卷积v2: More Deformable, Better Results
  7. MS Sql Server查询磁盘的可用空间,数据库数据文件及日志文件的大小及利用率
  8. 17、【易混淆概念集】第十一章1 项目风险 风险临界值 VS 风险承受力 风险管理流程 风险管理及变更流程 规划风险管理 识别风险
  9. 社会化媒体驱动营销转型
  10. codebook算法原理
  11. UEditor之实现配置简单的图片上传示例
  12. CXK, 出来打球!
  13. linux SFTP用户创建 不允许用户登录,并且连接只允许在制定的目录下进行操作
  14. FairyGUI笔记 :MovieClip(三)
  15. what is Personnel
  16. 泛函分析——内积空间定义的概念
  17. stata合并多张箱线图的命令
  18. 三博脑科医院:癫痫的治疗像是一场“对抗赛”
  19. scratch编程密室逃脱
  20. 为某一目录创建Internet来宾账户

热门文章

  1. Rhino学习教程——1.1
  2. 18、HTML5 Video(视频)和 audio(音频)
  3. servlet跳转问题
  4. Mac OS X下面 Node.js环境的搭建
  5. Myeclipse8.5 最新注册码以使用方法(可以用到2015年!!!)
  6. V4L2驱动程序架构
  7. server sql 数据总行数_一种快速统计SQL Server每个表行数的方法
  8. 用VS Code写 Python / Groovy / Kotlin
  9. 泛微发布亿元补贴计划,推动移动办公普及
  10. HDU1164 Eddy's research I(解法二)