关于java:前端抱怨-API-响应慢到底慢在哪里

39次阅读

共计 2717 个字符,预计需要花费 7 分钟才能阅读完成。

来自: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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0