如何使用 Ai 发现和诊断由代码产生的性能问题

引言

我们在不少项目中都会和客户的开发者或架构师一起尝试使用 OneAPM 一起分析和优化 Java 应用程序的性能问题,发现大部分的性能问题,往往并不是因为在某一个具体方法上缓慢的一两毫秒,更多的是因为糟糕的架构设计,不合适的框架配置,错误的数据库访问模式,乱打日志以及内存过度消耗导致的 GC 异常。下面我将重点介绍如何使用 Ai 发现和诊断由于代码产生的性能问题。

一.常见的代码问题大概有以下几种可能:

  • 调用远程服务时间长:

    • 存在网络、调用内部服务、调用外部服务异常
  • 代码异常:

    • 代码存在bug,比如循环、调用错误等
  • 代码执行时间过长:

    • 技术架构问题
    • 代码逻辑问题

二.我遇到过的用户案例分析:

1、问题类型:调用远程服务时间长

  • 问题发现:

    • 由拓扑图发现,节点显示为红色,点击弹框发现某web事务入口的响应时间较长
      Sjcode1
    • 点击该web事务入口,进入调用链追踪,点击图形中的“可钻取”,进行更深一步的定位(trace或snapshot)
      Sjcode2
  • 问题调查和分析:Trace部分包括四个模块,概要、详情、参数、SQL。在概要部分包括曲线图和最慢组件两部分,用户通过曲线图可以直接看到耗时占比最多的方法(或外部服务或数据库调用);通过最慢组件部分,可以直观的看到耗时最长的慢方法(或外部服务或数据库调用)。比如在下图中我们可以看到/rest方法耗时特别长,执行时间花了10.07s。
    Sjcode3
    点击进入详情可以查看到是调用外部服务时耗时最长,因此可以去优化此外部服务的调用。
    Sjcode4

  • 针对这个问题可能给出的建议: 该外部服务有如下两种情况:1)未安装oneapm探针的服务,对此可以安装ai探针进行监控,判断更深层次的原因;2)第三方服务,对此可以与服务提供商联系,进行外部服务的优化。

2、 代码异常

  • 问题发现:在拓扑图中发现,节点显示为红色,点击弹框发现web事务的响应时间较长。在web事务页面包括总览、trace(或snapshot)、性能剖析三部分。
    Sjcode4

  • 问题调查和分析:

总览页面排查
总览页面可以查看该web事务执行组件的响应时间图、最慢组件总览(注:组件一般为慢方法、慢外部调用、慢数据库调用) 在响应时间图表中以该web事务的组成方法为单位,绘制出每个方法的调用耗时图,用户可点击进行钻取查看所选时间内的trace列表,或者直接查看总览部分,快速定位是哪部分产生问题。最慢组件部分包括慢sql、慢内部调用、慢远程调用等,对于慢sql,可以在数据库列表查看该sql数据的相关详情;对于慢远程调用,可以在远程服务列表查看该语句的调用详情。
Sjcode5

trace页面分析
在trace页面选择某条trace,点击进入详情,在总览页面-最慢组件看到某方法执行耗时长(org.apache.http.impl.client.AbstractHttpClient/execute)耗时长达75.06秒,点击“详情”查看代码级别的调用详情,可以在执行此方法时进入了循环,因此可能是此处代码有问题,需要进行代码排查及优化。
Sjcode6

Sjcode7
Oneapm系统支持快照功能,过去两分钟内web事务的响应时间超过2s则会触发快照机制,产生系统快照。快照采集时将应用系统进行了中断,因此捕获了更全面的代码堆栈信息,可以更深层次的定位到应用系统问题。
Sjcode8

快照堆栈详情:
Sjcode9

  • 针对这个问题可能给出的建议: 查看代码进行问题优化