来自:juejin.cn/post/6936063402640932878

剖析API的耗时是将API的总耗时拆分为不同的局部,清晰的晓得是什么起因导致耗时过高。咱们借助不同的工具,在不同的网络环境下进行耗时剖析,从而提出相应的优化倡议。
  1. 申请发送过慢导致耗时减少;
  2. DNS解析过慢导致耗时减少;
  3. 顽劣的网络环境导致耗时减少;
  4. 始终在排队导致响应过慢;
  5. 服务端响应过慢导致耗时减少;
  6. 响应体积过大导致耗时减少;
  7. 等等……

个别从感官上感觉API接口响应慢,大部分人会间接归纳于服务端解决慢,其实是不合理的。通过在内网环境下的API耗时剖析和外网环境下的API耗时剖析的比照,个别会意识到起因所在。

通过浏览器的开发者工具剖析

开发者工具

重点关注指标Waiting (TTFB),TTFB代表第一个字节达到的工夫。此工夫包含一次往返提早和服务器筹备响应所破费的工夫。能够近似的认为是服务端耗时。

如果网络状况不好或者响应数据过大,则Content Download耗时会长一些,这时候应该思考压缩响应.

Timing

开发者工具中Network中显示了当前页中调用的网络资源,点击资源能够查看资源的详情,其中Timing是资源调用时的耗时状况。

  • Queueing. 【排队中】浏览器在以下状况下将申请排队:
    • 有更高优先级的申请.
    • 已为该起源关上了六个TCP连贯,这是限度。仅实用于HTTP/1.0HTTP/1.1.
    • 浏览器正在磁盘缓存中短暂调配空间.
  • Stalled. 【停滞】该申请可能因为排队中形容的任何起因而进行.
  • Proxy negotiation. 【代理协商】浏览器正在与代理服务器协商申请.
  • Request sent. 【发送申请】该申请正在发送.
  • Waiting (TTFB). 【期待中】浏览器正在期待响应的第一个字节。TTFB代表第一个字节达到的工夫。此工夫包含一次往返提早和服务器筹备响应所破费的工夫.
  • Content Download. 【响应内容下载】浏览器正在接管响应.

其余可能呈现的

  • DNS Lookup. 【DNS】浏览器正在解析申请的IP地址.
  • Initial connection. 【初始化连贯】浏览器正在建设连贯,包含TCP握手/重试和协商SSL.

通过httpstat工具剖析

httpstat git地址:

https://github.com/reorx/http...

如果是在Linux服务器上进行调用,则能够应用httpstat

装置

间接下载脚本

wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.py

通过pip

pip install httpstat

Mac

brew install httpstat

应用

httpstat能够应用cURL的参数。

httpstat www.baidu.com httpstat 127.0.0.1/post -X POST --data-urlencode "id=1" -v

Server Processing能够近似的认为是服务端耗时。

服务端到底慢在哪里?

打印耗时日志?

StopWatch stopWatch = new StopWatch();stopWatch.start();// ...stopWatch.stop();LOGGER.info("[某某某业务] - [Time:{}ms]", stopWatch.getLastTaskTimeMillis());

脑子霎时一热就会应用的办法,简略间接,然而如果定位不精确,你可能要加很多这种日志。

还是用火焰图吧

让软件执行状况可视化,是性能剖析、调试的利器

火焰图的生成工具很多,比方Async Profilerlinux-perl,网上也有很多对于这方面的介绍,IDEA也集成Async Profiler,这个很不便。

IntelliJ IDEA中的火焰图

关上火焰图

如果没有开启,则点击+号,进行增加。

抉择程序进行火焰图的剖析

能够抉择一个曾经运行中的java程序进行剖析,输入火焰图。

的剖析

间接应用Async Profiler更简略

async-profiler git地址[1]

装置

从git上间接下载。

解压下可用。

简略应用

执行命令。

./profiler.sh -d 10 -f /tmp/flamegraph.svg <pid>./profiler.sh -e itimer -d 10 -f /tmp/flamegraph.svg <pid>

能够通过-e来指定cpualloclockwallitimerClassName.methodName

  • cpu:在这种模式下,profiler收集堆栈跟踪样本,包含Java办法、本机调用、JVM代码和内核函数。
  • alloc:能够将探查器配置为收集调配最大堆内存的调用站点,而不是检测耗费CPU的代码。即查看以后分配内存最多的中央。
  • lock:满足的锁定尝试,包含Java对象监视器和可重入锁。
  • wall:通知async-profiler在给定的工夫内对所有线程均匀采样,而不论线程状态如何: 运行、休眠或阻塞。例如,在剖析应用程序启动工夫时,这可能会有所帮忙。。
  • ClassName.methodName:ClassName.methodName选项应用给定的Java办法,以便应用堆栈跟踪记录此办法的所有调用。
  • cpu:在这种模式下,profiler收集堆栈跟踪样本,包含Java办法、本机调用、JVM代码和内核函数。

在浏览器中关上file:///tmp/flamegraph.svg,并找到调用的API,我这里调用的是ProjectManageController中的findProject办法。

依据长度能够看出该办法中调用办法的耗时状况,这样咱们就晓得耗时次要集中在什么中央。

PS:如果办法名被编译掉了,那么能够在java启动时退出-XX:+PreserveFramePointer

做更多的工作

用户体验的优化是一个长期而艰巨的过程,为了掂量咱们网站的性能是否良好,咱们有更多的工作须要去做。通常,会在底层自定义一些以用户为核心的指标,比方Server-Timing[2]。

参考资料

[1]https://github.com/jvm-profil...\
[2]https://w3c.github.io/server-...

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!