如何快速定位接口响应慢问题

一、背景

在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧…

本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。

二、步骤
2.1 定位
定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。

2.1.1 工具监控
就工具而言,推荐使用 arthas ,用到的是 https://link.csdn.net/?target=https%3A%2F%2Falibaba.github.io%2Farthas%2Ftrace.html 命令

具体安装步骤很简单,大家自行研究。

我的使用步骤是,先最终待研究的函数的最外层:

trace com.xxx.service.impl.AServiceImpl refresh

其中耗时最多的子函数会被标红色

Affect(class-cnt:2 , method-cnt:2) cost in 525 ms.
`---ts=2020-0X-0Y 13:33:18;thread_name=DubboServerHandler-127.0.0.1:20880-thread-36;id=24e;is_daemon=true;priority=5;TCCL=com.mmm.WWWClassLoader@4362d7df`---[1761.834357ms] com.xxx.service.impl.AServiceImpl$$EnhancerBySpringCGLIB$$e3cd7543:refresh()+---[0.017066ms] com.xxx.service.impl.AServiceImpl$$EnhancerBySpringCGLIB$$e3cd7543:$jacocoInit()`---[1761.00347ms] org.springframework.cglib.proxy.MethodInterceptor:intercept()`---[1757.647111ms] com.xxx.service.impl.AdServiceImpl:refresh()+---[0.006629ms] com.xxx.biz.yyy.service.impl.AServiceImpl:$jacocoInit()+---[0.004073ms] java.util.Collections:singletonList()+---[1709.203302ms] com.yyy.service.impl.AServiceImpl:refreshSomeThings()`---[48.135719ms] com.yzzzz.service.impl.AServiceImpl:createSurvey()

继续再 trace 耗时最多的子函数。

trace com.yyy.service.impl.AServiceImpl refreshSomeThings

最终定位到最影响耗时的函数上,继续往下跟。

最后发现造成性能瓶颈的函数是一个网络请求,单次请求大概 100多毫秒。

为了避免调用的数据量太大,项目中采用分批调用的方式,但是每个批次太小,导致请求次数过多。

假设请求 N 次(如 10次),每次请求 M毫秒(如 200ms),总耗时就是 N*M (2000)毫秒。

2.1.2 猜想
如果开发经验足够丰富,大致可以猜出哪些接口可能存在性能问题。

最常见的有:

慢 SQL 会是性能瓶颈,主要原因是没有命中索引。
发送远程数据请求(RPC 远程调用、HTTP 远程调用)。
I/O 操作等。
最常见的是在循环中执行 SQL或者网络请求。

然后审查一下自己的代码发现 SQL 查询部分都可以命中索引,调用链路上有一个函数最终会调用 HTTP 请求,而且是在一个循环里。

因此最有可能成为造成接口延时的是底层依赖的 HTTP 请求。

2.2 解决
既然 HTTP 请求是性能瓶颈,那么要尽量减少请求,或者让请求由串行改为多线程并发/并行。

减少网络请求的次数,可以将多个请求合并成一个批量接口(或者增加批量请求的每个批次的大小)。

这里的批次甚至可以使用动态配置,根据情况动态修改。

将串行改为并行可以使用 CompletableFuture 来实现,具体参见:《Java 数据分批调用接口的正确姿势》

最终一个接口从1 s - 2 s降低到了 200 ms 以内。

3、总结
很多人不愿意学习 arthas ,如果不去学习不去了解,遇到可以用上的场景想不起来去用。

另外大家可以积累下开发过程中常见的性能瓶颈的原因,以便未来遇到性能瓶颈是可以快速排查和解决问题。

最后大家在开发阶段或测试阶段,多看错误日志,多关注接口的响应时长等,尽早排除问题,尽早做优化。

希望本文对大家开发能够有帮助。

如何快速定位接口响应慢问题相关推荐

  1. RestfulToolKit:根据接口,快速定位代码

    工具:IDEA 插件:RestfulToolKit 快捷键: Ctrl + \  或 Ctrl + Alt + N 原文 RestfulToolKit:根据接口,快速定位代码

  2. 使用Arthas快速定位SpringBoot接口超时问题的神器

    使用Arthas快速定位SpringBoot接口超时问题的神器 文章系转载,便于整理和分类,原文地址:https://mp.weixin.qq.com/s/Nm_QGzCtwY08Dd1XOtPaaw ...

  3. 90%的人会遇到性能问题,如何用1行代码快速定位?

    阿里妹导读:在<如何回答性能优化的问题,才能打动阿里面试官?>中,主要是介绍了应用常见性能瓶颈点的分布,及如何初判若干指标是否出现了异常. 今天,齐光将会基于之前列举的众多指标,给出一些常 ...

  4. 阿里软件测试工程师手把手教学—如何快速定位bug 编写测试用例?

    作为一个测试人员,如果你连常见的系统问题都不懂得分析,频繁地把前端人员问题分配给后端人员,把后端人员问题分配给前端人员,那么你在团队发展中的地位是显而易见的,声誉.赏识.加薪应该是你遥不可及的梦想. ...

  5. WebApi接口 - 响应输出xml和json 转

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  6. 测试人员如何使用浏览器的f12_测试过程中如何快速定位一个bug

    作为测试人员,和我们最常打交道的,莫属bug.但是测试不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能. 如何快速定位一个bug,就需要对功能.产品的 ...

  7. python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...

    之前有一篇文章,介绍了如何使用JSONSchema对接口响应进行断言,主要的适用场景是对响应的数据结构进行校验,保证客户端收到的数据结构稳定和合法.今天,介绍使用JSONPath对接口响应的值进行断言 ...

  8. python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

    在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲 ...

  9. java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

最新文章

  1. 实现AGI,强化学习就够了?Sutton、Silver师徒联手:奖励机制足够实现各种目标...
  2. Quartz.NET基础知识概述
  3. 【编程1】 Two Sum + 哈希算法
  4. flex使用FlexPrintJob打印问题
  5. CTF Geek Challenge——第十一届极客大挑战Re Write Up
  6. uml和模式应用 pdf_总结分享:PHP中常见的五种设计模式
  7. 静态属性,函数闭包,call/apply,继承
  8. MFC中 windows object 和 C++ object
  9. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
  10. 测试工作——XPath
  11. 【LuoguP5289】[十二省联考2019] 皮配
  12. 怎么安装python3.7 setuptools与pip_python3之安装、pip、setuptools
  13. idea下properties转成中文
  14. scala代码示例_Scala集合示例
  15. 百度云不限速破解详细教程附工具
  16. 拼助手/帮你拼/兔查查小程序如何查询拼多多砍价记录?
  17. Mac版Dream weaver CC 2018如何安装教程(%¥c%激*.活)和汉化
  18. cvs配电保护断路器_施耐德断路器CVS100N详解
  19. 合并两个 Wav 文件流的函数 - 回复 刘文强 的问题
  20. 开黑 你造【王者荣耀】是什么编程语言开发的吗?

热门文章

  1. python 通过ftp自动 上传指定excel文件
  2. 新手小白搭建服务器环境如何选择呢?lnmp还是lamp?
  3. 啊哈添柴挑战Java1008. 输入两个整数,倒序输出
  4. 金融科技大数据产品推荐:金融魔方 ---专业的金融SaaS服务平台
  5. java 实现繁简字体转换(笨方法)
  6. 一文讲解单片机、ARM、MCU、DSP、FPGA、嵌入式错综复杂的关系!
  7. cad线性标注样式修改在哪里_CAD标注样式如何设置?
  8. 2022.10.1 NYIST 国庆欢乐进行曲题解
  9. linux界面回收站图标没了,Ubuntu美化教程:在AWN中添加“显示桌面”和“回收站”图标...
  10. 数据小助手:DataAssistant开篇