前端抱怨 API 响应慢,到底慢在哪里?

简介: 前端抱怨 API 响应慢,到底慢在哪里?

请求发送过慢导致耗时增加;

DNS解析过慢导致耗时增加;

恶劣的网络环境导致耗时增加;

一直在排队导致响应过慢;

服务端响应过慢导致耗时增加;

响应体积过大导致耗时增加;

等等……

一般从感官上觉得API接口响应慢,大部分人会直接归结于服务端处理慢,其实是不合理的。通过在内网环境下的API耗时分析和外网环境下的API耗时分析的对比,一般会认识到原因所在。


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

开发者工具

image.png

重点关注指标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/httpstat


如果是在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

image.png


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中的火焰图

打开火焰图

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


image.png


选择程序进行火焰图的分析

可以选择一个已经运行中的java程序进行分析,输出火焰图。


的分析


image.png

直接使用Async Profiler更简单

async-profiler git地址[1]


安装

从git上直接下载。


image.png


解压下可用。


简单使用

执行命令。


./profiler.sh -d 10 -f /tmp/flamegraph.svg

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


可以通过-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代码和内核函数。

image.png


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


image.png


根据长度可以看出该方法中调用方法的耗时情况,这样我们就知道耗时主要集中在什么地方。


PS:如果方法名被编译掉了,那么可以在java启动时加入-XX:+PreserveFramePointer


做更多的工作

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


参考资料

[1]https://github.com/jvm-profiling-tools/async-profiler\ [2]https://w3c.github.io/server-timing




相关文章
|
29天前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
328 130
|
2月前
|
JSON API 数据格式
1688店铺订单列表订单详情订单物流API响应数据解析
1688平台作为阿里巴巴旗下的B2B电商利器,提供高效订单管理API,支持订单查询、状态变更与物流同步,助力企业提升运营效率。本文附Python请求示例代码,实现便捷对接与数据获取。
|
2月前
|
JSON API 数据格式
天猫商品评论API响应数据解析
天猫商品评论API是淘宝开放平台提供的数据接口,支持获取评论内容、评分、时间等信息,具备筛选、分页功能,适用于电商数据分析与用户行为研究。
|
2月前
|
JSON 监控 API
天猫商品详情API响应数据解析
天猫商品详情API是天猫开放平台的核心接口,通过商品ID可获取标题、价格、图片、库存等详细信息,广泛应用于价格监控、竞品分析等场景。支持HTTP请求,返回JSON格式数据,Python示例代码展示了如何高效调用该接口获取商品数据。
|
2月前
|
JSON API 数据格式
淘宝商品评论API响应数据解析
淘宝商品评论API是淘宝开放平台的重要接口,支持获取商品用户评价信息,助力电商数据分析与商品优化。提供分页查询、评分筛选、时间过滤等功能,数据格式为JSON,适用于Python等语言调用,便于开发者灵活集成。
|
2月前
|
JSON API 数据格式
小红书笔记详情API响应数据解析
小红书笔记详情API可获取笔记核心数据,适用于内容分析与竞品监测。支持HTTP GET/POST请求,返回JSON格式数据,包含笔记标题、互动数据及作者信息。文档提供Python请求示例,建议添加异常重试机制,助力品牌营销与用户行为分析。
|
2月前
|
数据采集 JSON 监控
值得买商品详情API响应数据解析
“什么值得买”商品详情API支持获取商品标题、价格、促销信息等核心数据,适用于价格监控与优惠分析。提供商品基础信息、实时价格、评价数据及库存状态监控,助力电商数据采集与分析。
|
3月前
|
数据采集 JSON API
1688商品详情API响应数据解析
1688商品详情API支持获取商品基础信息、价格、库存、图片及商家数据,适用于选品分析与市场研究。提供标准化JSON数据格式,提升电商数据采集效率。需配置商品ID等参数,示例代码展示Python调用方式。
|
3月前
|
JSON API 开发者
京东商品评论API响应数据解析
京东商品评论API(JD.item_review)助力开发者获取商品评论数据,如内容、评分、时间等,支持Python调用,适用于商品分析与用户研究。
|
2月前
|
JSON 监控 BI
京东店铺所有商品API响应数据解析
京东店铺商品API由京东开放平台提供,可获取指定店铺的商品基础信息、价格、库存及销量等数据,适用于商品管理、竞品分析、价格监控等场景。支持HTTPS请求、JSON格式返回,提供Python示例,便于第三方系统集成与数据应用。