共计 2717 个字符,预计需要花费 7 分钟才能阅读完成。
来自:juejin.cn/post/6936063402640932878
剖析 API 的耗时是将 API 的总耗时拆分为不同的局部,清晰的晓得是什么起因导致耗时过高。咱们借助不同的工具,在不同的网络环境下进行耗时剖析,从而提出相应的优化倡议。
- 申请发送过慢导致耗时减少;
- DNS 解析过慢导致耗时减少;
- 顽劣的网络环境导致耗时减少;
- 始终在排队导致响应过慢;
- 服务端响应过慢导致耗时减少;
- 响应体积过大导致耗时减少;
- 等等……
个别从感官上感觉 API 接口响应慢,大部分人会间接归纳于 服务端解决慢
,其实是不合理的。通过在内网环境下的 API 耗时剖析和外网环境下的 API 耗时剖析的比照,个别会意识到起因所在。
通过浏览器的开发者工具剖析
开发者工具
重点关注指标Waiting (TTFB)
,TTFB 代表第一个字节达到的工夫。此工夫包含一次往返提早和服务器筹备响应所破费的工夫。能够近似的认为是服务端耗时。
如果网络状况不好或者响应数据过大,则 Content Download
耗时会长一些,这时候应该思考压缩响应.
Timing
开发者工具中 Network
中显示了当前页中调用的网络资源,点击资源能够查看资源的详情,其中 Timing
是资源调用时的耗时状况。
Queueing
.【排队中】浏览器在以下状况下将申请排队:-
- 有更高优先级的申请.
- 已为该起源关上了六个
TCP
连贯,这是限度。仅实用于HTTP/1.0
和HTTP/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 Profiler
、linux-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
来指定cpu
、alloc
、lock
、wall
、itimer
、ClassName.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 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!