要对新服务做性能测试,分析代码热点,初识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
          • 火焰图
        • 内存分析
  • 参考

    • 如何读懂火焰图?
    • Linux 效能分析工具: Perf

转载于:https://www.cnblogs.com/fattyCoder/p/10167740.html

perf + 火焰图用法 小结相关推荐

  1. 【性能】perf + 火焰图分析软件性能瓶颈

    目录 零.即看即用 一.perf 命令 perf简介 perf record参数 命令例子 二.火焰图的含义 三.互动性 四.火焰图示例 五.局限 六.Node 应用的火焰图 七.浏览器的火焰图 八. ...

  2. linux性能优化——利用perf火焰图分析内核调用

    1.内核进程 我们知道,在 Linux 中,用户态进程的"祖先",都是 PID 号为 1 的 init 进程.比如,现在主流的 Linux 发行版中,init 都是 systemd ...

  3. perf+火焰图 = 性能分析利器

    perf 1. perf安装 sudo apt install linux-tools-common 检查是否安装好 perf 如果出现 You may need to install the fol ...

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

    From: https://www.cnblogs.com/happyliu/p/6142929.html 1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便 ...

  5. Perf火焰图生成及分析

    1抓取性能数据 先通过top或者ps 命令查询需要抓取火焰图的pid,然后执行如下脚本perf.sh抓取相应进程的火焰图数据: #!/bin/bashfunction doperfpid() {ech ...

  6. C++ 之 perf+火焰图分析与Debug

    0. 简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,之前作者就专门写过两篇博客(Ubuntu环境下便于调试代码的工具.Valgrind对ROS程序的可视化分析)来介绍性能分析的问 ...

  7. perf +火焰图使用

    以mysqld进程为例: [root@VM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 g ...

  8. mysql火焰图_【性能】如何使用perf和火焰图分析系统性能?

    一.实验环境 二.实验案例分析 安装完成后,我们先在第一个终端,执行下面的命令运行案例,也就是一个最基本的 Nginx 应用: 运行 Nginx 服务并对外开放 80 端口 # docker run ...

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

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

最新文章

  1. 【Google Play】Google Play 开放式测试 ( 简介 | 发布开放式测试版本 )
  2. 详解Linux2.6内核中基于platform机制的驱动模型
  3. 一个python发包的脚本
  4. linux用date指令,Linux中date指令的使用
  5. Remix:高分辨率目标检测,面向边缘设备、可调谐
  6. react with form
  7. 面试准备之SQL 3——数据管理
  8. squid代理与缓存(上)
  9. js点击页面其他地方如何隐藏div元素菜单
  10. html创建qq注册页面,用javascript制作qq注册动态页面
  11. geoserver中sld设置
  12. java科学计算器代码_用JAVA编写的科学计算器源代码是什么?
  13. 压力变送器matlab,总结压差变送器三种不同故障以及处理方法[理论结合实际]
  14. android-第一行代码-第六章数据储存——持久化技术 含MMKV和Room新知识点(温故而知新)学习记录
  15. redis 客户端 -- lettuce 介绍
  16. EOS代码架构及分析(二)
  17. 微服务架构 API 的开发与治理
  18. 训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解
  19. 形式语言和自动机总结DFA、NFA
  20. 【无标题】IP地址段必须正好可以聚合成1个地址块

热门文章

  1. SAP SD:VL10A上清不掉的尾巴
  2. 对C#、.Net、.Net Frameworke、托管和非托管代码的具体理解
  3. java ssm基于springboot的通知反馈系统
  4. 切面的优先级、重(chong)用切点表达式
  5. 超休闲游戏潜龙在渊,《Catwalk Beauty》一鸣惊人
  6. 我见过的最脑残也是最好懂的人工神经网络算法教程
  7. 【字符串】PTA试题——敲笨钟(20分)
  8. 2018-07-13心情日记
  9. 【子网划分】求子网网络前缀、子网地址、每个子网可以分配给主机使用的最小地址和最大地址
  10. 让你用sublime写出最完美的python代码--windows环境