• perf + 火焰图用法 小结


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

    作者: fattycoder

    出处: https://www.cnblogs.com/fattyCoder/

    关于作者:挺喜欢写代码的

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(564790073@qq.com)咨询.

  • 相关阅读:
    我为能准时下班而做的准备,以及由此的收获,同时总结下不足
    用象棋的思维趣说IT人的职业发展和钱途
    简历上如果出现过于高大上的项目,反而过犹不及:再论如何通过项目引出技术
    用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)
    如果当前没有拿得出手的简历,也别慌,努力的话最多两年情况就能改变
    分析若干没面试机会和没体现实力的简历
    IT人为了自己父母和家庭,更得注意自己的身体和心理健康
    Spring Cloud系列文,Feign整合Ribbon和Hysrix
    以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
    博客园是个大金矿,管理员不挖掘有些可惜:给博客园提一些双赢的建议
  • 原文地址:https://www.cnblogs.com/fattyCoder/p/10167740.html
Copyright © 2020-2023  润新知