不改一行代码定位线上性能问题
背景 最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。 尝试解决 由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。 没办法只能硬着头皮上了。 中途有抱着侥幸心里让运维查看了 Nginx 里 OpenAPI 的响应时间,想把锅扔给网络。结果果然打脸了; Nginx 里的日志也表明确实响应时间确实有问题。 为了清晰的了解这个问题,我简单梳理了这个调用过程。 整个的流程算是比较常见的分层架构: 客户端请求到 Nginx。 Nginx 负载了后端的 web 服务。 web 服务通过 RPC 调用后端的 Service 服务。 日志大法 我们首先想到的是打日志,在可能会慢的方法或接口处记录处理时间来判断哪里有问题。 但通过刚才的调用链来说,这个请求流程不短。加日志涉及的改动较多而且万一加漏了还有可能定位不到问题。 再一个是改动代码之后还会涉及到发版上线。 工具分析 所以最好的方式就是不改动一行代码把这个问题分析出来。 这时就需要一个 agent 工具了。我们选用了阿里以前开源的 Tprofile 来使用。 只需要在启动参数中加入 -javaagent:/xx/tprofiler.jar