要对新服务做性能测试,分析代码热点,初识perf,做下总结

  • perf + 火焰图用法

    • perf简介

      Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈(stack)

      • 通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread)

        ,也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈

      • 通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题

        sudo perf record -F 99 -p 13204 -g -- sleep 30
      • 上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒

      • 运行后会产生一个庞大的文本文件。如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。

      • 为了便于阅读,perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列

    • 火焰图简介

      火焰图(flame graph), 是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈

      • y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

      • x轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

      • 火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

      • 颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

    • 火焰图互动性

      火焰图是 SVG 图片,可以与用户互动。

      • 鼠标悬浮

        • 火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子

          Function: Taf::TC_Thread::threadEntry (7,665 samples, 49.9%)
      • 点击放大

        • 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息
        • 左上角会同时显示"Reset Zoom",点击该链接,图片就会恢复原样。
      • 搜索

        • 按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示
    • 实例

      • 登录宿主机或者容器

        go -d A
      • 查看进程pid

        ps aux|grep name
      • 使用perf记录和生成

        perf record -F 99 -p 101503 -m 4 -g -a -- sleep 60
        perf script > out.perf
      • 制作火焰图

        • 从github上clone下来

          git clone https://github.com/brendangregg/FlameGraph.git
          cd FlameGraph
        • 处理perf script

          ./stackcollapse-perf.pl out.perf > out.folded
        • 绘制SVG

          ./flamegraph.pl out.folded > pmCount.svg
    • 火焰图局限性

      • 调用栈不完整
        • 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
      • 函数名缺失
        • 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。
    • 火焰图示例

      • 从图中看出,jce 的display方法是代码热点,占用cpu资源很高, 优化之后预计性能提升20%+
  • 后台服务性能测试常见指标

    • 测试指标

      • QPS(吞吐量)

        • 每秒钟系统能够处理的请求数、任务数
      • 响应时间

        • 服务处理一个请求或一个任务的耗时
      • 错误率

        • 一批请求中结果出错的请求所占比例
    • 压测

      • 参数

        • 并发数
        • 请求个数
      • 分析

        • req个数
        • 有效rsp个数
        • 耗时分布
          • 耗时随QPS上升的曲线
        • QPS
          • 第一次出现异常,即当前系统已经开始出现异常(QPS=有效RSP/主调超时时间)
        • 异常率统计
          • 异常率=失败RSP/REQ
    • 优化

      • 分析服务瓶颈

        • top
        • vmstat
        • google-perftools
      • 专项优化

        • CPU分析

          • perf
          • 火焰图
        • 内存分析
  • 参考

perf + 火焰图用法 小结的更多相关文章

  1. [转]perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  2. perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  3. 火焰图(Flame Graphs)的安装和基本用法

    火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...

  4. 使用perf生成Flame Graph(火焰图)

      具体的步骤参见这里: <flame graph:图形化perf call stack数据的小工具>   使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需 ...

  5. 使用linux perf工具生成java程序火焰图

    pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

  6. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  7. 使用perf + FlameGraph生成进程火焰图

    FlameGraph代码:https://github.com/cobblau/FlameGraph 使用方法 1,perf record --call-graph dwarf -p 12345 2, ...

  8. 火焰图&perf命令

    最近恶补后端技术,发现还是很多不懂,一直写业务逻辑容易迷失,也没有成长.自己做系统,也习惯用自己已知的知识来解决,以后应该多点调研,学到更多的东西应用起来. 先学一个新的性能分析命令. NAME pe ...

  9. Linux程序性能分析和火焰图

    Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...

随机推荐

  1. 搭建Hexo博客系统

    也许这个教程部署不是特别详细,因为我主要是参考这个链接:https://blog.csdn.net/weixin_39879178/article/details/80319392 感觉这里已经写的很 ...

  2. JQuery资源网站(收藏)

    收藏几个不错的JQuery资源网站,以后备用,给共享者点个赞!!! http://jquery.com/ http://www.htmleaf.com/ http://www.oschina.net/ ...

  3. 用javascript调用表单验证事件时,为什么return false了还是把表单submit了?

    表单提交前,都会有定义一个验证的方法以对用户提交的内容进行限定,今天写到了这个,但出现了一个好郁闷的东西,就是一点提交了,调用我自己写的一个CheckForm()方法时,我明明写了return fal ...

  4. 书单list

    2018年对我来说是个踩到狗屎的一年,不能说运气差,只能说过去所有的不良决策后果都集中到2018年爆发了,希望新的一年,都好起来.书单很短,买的确实很多,真的惭愧. 昨日世界 南渡北归 上学记 回忆录 ...

  5. selenium java maven 自动化测试(二) 页面元素获取与操作

    在第一节中,我们已经成功打开了页面,但是自动化测试必然包含了表单的填写与按钮的点击. 所以在第二章中我以博客园为例,完成按钮点击,表单填写 还是以代码为准,先上代码: package com.ryan ...

  6. JDBC—执行sql语句的通用方法

    /* * 执行 sql的方法集 * delete,insert into ,update */ public static void update(String sql){ Connection co ...

  7. java web 常识

    model.addattribute()的作用: 1.往前台传数据可以传对象,List,通过el表达式${}获取,类似于request.setAttribute("sts",sts ...

  8. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...

  9. Kafka 部署指南-好久没有更新博客了

    最近到了一家新公司,很多全新技术栈要理解.每天都在看各类 English Offcial Document,我的宗旨是我既然看懂了,就写下来分享,这是第一篇. 基本需求: 1.已有 zookeeper ...

  10. Spark异常:A master URL must be set in your configuration处理记录

    问题描述:    项目中一位同事提交了一部分代码,代码分为一个抽象类,里面含有sparkcontent,sparkSession对象:然后又三个子类实例化上述抽象类,这三个子类处理三个任务,最后在同一 ...