美文网首页随笔
【性能优化】火焰图实战

【性能优化】火焰图实战

作者: 熊本极客 | 来源:发表于2021-11-16 22:41 被阅读0次

    1 火焰图介绍

    性能调优利器:火焰图《性能之巅》学习笔记之火焰图 其之一都提到了《性能之巅》。

    火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。(摘自性能调优利器:火焰图)

    如何分析生成的火焰图(摘自《性能之巅》学习笔记之火焰图 其之一:
    ● 火焰图顶部显示了采样过程中on CPU的方法。对CPU profiles,这些方法直接占用cpu资源。对于其他的profile,这些方法导致了相关的内核事件。
    ● 在火焰图顶部寻找“高原”状的方法,位于顶部的某个很宽的方法,表示其在采样中大量出现。对于CPU profiles,这意味着这个方法经常在CPU上运行。
    ● 自顶向下看显示了调用关系,上边的方法被其下方的方法调用,以此类推。快速的从上往下浏览可以理解某个方法为什么被调用。
    ● 自底向上看显示了代码逻辑,提供了程序的全局视图。底部的方法会调用其顶部的多个方法,以此类推。自底向上看可以看到代码的分支形成的多个小型的“塔尖”。
    ● box的宽度可以用来比较,更宽的box意味着在采样结果中更多的比例。
    ● 对于cpu profiles 来说,如果a方法比b方法宽,有可能是因为a方法本身执行需要使用比b方法更多的cpu。也有可能是a方法被调用的次数比b方法更频繁。采样的最终结果并不能体现一个方法被调用多少次,所以这两种情况都有可能。
    ● 如果一个方法顶部出现了两个“大塔尖”,导致火焰图中出现一个“大分叉”,这样的方法很值得研究。两个“塔尖”可能是被调用的两个子方法,也可能是条件语句的两个不同分支。

    2 性能分析

    接下来以某微服务为例,来实际看一下如何优化程序的性能。

    2.1 on-cpu 火焰图

    使用 arthas profiler 可以生成 on-cpu 火焰图

    推荐阅读 arthas 的中文社区

    $profiler start -e cpu
    
    1.1.JPG

    分析:addIotdaData 方法中大部分时间都用于日志打印,结合代码查看,发现每接收到一条数据都打印了日志,因此在日志打印上占用了较多的 CPU。

    1.2.JPG

    分析:addIotdaData 上使用了两次 aop,大约占用了12%左右的 CPU。

    2.2 off-cpu 火焰图

    使用 arthas profiler 可以生成 off-cpu 火焰图

    $profiler start -e lock
    
    3.1.JPG

    分析:绝大部分等待时间都是在 pulsar 的 producer 中,结合代码查看,在发送数据时使用的是同步的方式。

    2.3 Hot/Cold 火焰图

    使用 arthas profiler 可以生成 Hot/Cold 火焰图

    $profiler start -e wall
    
    4.1.JPG

    cacheToken 耗时 10%,结合业务发现,这部分逻辑是不需要的,可优化。

    5.png
    6.JPG

    分析:tomcat 中非业务处理部分的耗时约为 30%,比实际业务处理的耗时(25%)还要多,因此考虑使用更高性能的 web 容器,比如 netty。

    使用 arthas profiler 可以生成内存火焰图:

    $profiler start -e alloc
    
    7.2.JPG

    分析:未发现有内存泄露的现象。

    3 性能测试

    性能测试的四个主要指标:

    响应时间:指应用系统从发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直观的反映了系统的“快慢”。
    并发数:系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。对于网站而言,并发数即系统并发用户数,指同时提交请求的用户数目,于此相对应,还有在线用户数(当前登录系统的用户数)和系统用户数(可能访问系统的总用户数)。
    吞吐量:指单位时间内系统处理的请求的数量,体现件系统的处理能力。对于网站,可以用“请求数/秒”或是“页面数/秒”来衡量,也可以用“访问人数/天”或是“处理的业务数/小时”等来衡量。TPS(每秒事务数)也是吞吐量的一个指标,此外还有 HPS(每秒 HTTP 请求数),QPS(每秒查询数)等。
    吞吐量 = ( 1000 / 响应时间 ms ) × 并发数
    性能计数器:是描述服务器或操作系统性能的一些数据指标。包括 System Load、对象与线程数、内存使用、CPU 使用、磁盘与网络 I/O 等指标。这些指标也是系统监控的重要参数,对这些指标设置报警阀值,当监控系统发现性能计数器超过阀值的时候,就向运维和开发人员报警,及时发现处理系统异常。

    上述内容摘自:性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化

    不同并发下的性能表现:

    8.png

    分析:200并发情况下,TPS与Response Time都比较稳定,300并发时,性能下降的比较厉害,250并发时,性能开始下降且变得不稳定。因此可以认为,系统能够稳定支持的并发数在200左右,TPS在1800左右,响应时间在50ms左右。

    相关文章

      网友评论

        本文标题:【性能优化】火焰图实战

        本文链接:https://www.haomeiwen.com/subject/mpdpwltx.html