当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 18:24:40 Java

来自:juejin.cn/post/6936063402640932878分析API的耗时,就是把API的总耗时分成不同的部分,从而清楚地知道是什么原因造成了高耗时。我们借助不同的工具,在不同的网络环境下进行耗时分析,从而提出相应的优化建议。请求发送慢导致耗时增加;由于DNS解析缓慢导致耗时增加;网络环境差导致耗时增加;一直排队反应慢;服务器响应慢导致耗时增加;增加时间消耗;etc...一般来说,API接口响应慢,大部分人会直接归咎于服务器处理慢,这其实是不合理的。通过对比内网环境下的API耗时分析和外网环境下的API耗时分析,大致就会明白原因。通过浏览器的开发者工具分析开发者工具,重点关注指标Waiting(TTFB),TTFB代表第一个字节到达的时间。该时间包括一个往返延迟和服务器准备响应所花费的时间。可以近似为服务端的耗时。如果网络不好或者响应数据量过大,ContentDownload的时间会比较长。这时,你应该考虑压缩响应。Timing开发者工具中的Network显示的是当前页面调用的网络资源。点击资源查看资源。Details,其中Timing是调用资源时的耗时情况。排队。[排队]浏览器在以下情况下将请求排队:有更高优先级的请求。已为此源打开六个TCP连接,这是限制。仅适用于HTTP/1.0和HTTP/1.1。浏览器正在磁盘缓存中临时分配空间。停滞不前。[Stall]请求可能因排队中描述的任何原因而停止。代理协商。[代理协商]浏览器正在与代理服务器协商请求进行协商。已发送请求。【发送请求】正在发送请求。等待(TTFB)。【Waiting】浏览器正在等待响应的第一个字节。TTFB代表第一个字节的时间。此时间包括往返延迟和服务器准备响应所需的时间。内容下载。[响应内容下载]浏览器正在接收响应。其他可能的DNS查找。[DNS]浏览器正在解析请求的IP地址。初始连接。[初始化连接]浏览器正在建立连接,包括TCP握手/重试和协商SSL。通过httpstat工具分析httpstatgit地址:https://github.com/reorx/http...如果是在linux服务器调用上执行,可以使用httpstat。安装直接下载脚本wgethttps://raw.githubusercontent.com/reorx/httpstat/master/httpstat.py通过pippipinstallhttpstatMacbrewinstallhttpstat使用httpstat使用cURL的参数。httpstatwww.baidu.comhttpstat127.0.0.1/post-XPOST--data-urlencode"id=1"-vServer处理,大致可以认为是服务端比较耗时。服务器哪里慢了?打印耗时日志?StopWatchstopWatch=newStopWatch();stopWatch.start();//...stopWatch.stop();LOGGER.info("[某业务]-[时间:{}ms]",stopWatch.getLastTaskTimeMillis());脑子一热就会用的方法,简单直接,但是如果定位不准,可能要加很多这样的日志。让我们用火焰图来可视化软件的执行过程,它是性能分析和调试的利器。生成火焰图的工具有很多,比如AsyncProfiler和linux-perl。方便的。IntelliJIDEA中的火焰图打开火焰图。如果火焰图没有开启,点击+号添加。选择分析火焰图的程序您可以选择一个正在运行的java程序来分析并输出火焰图。直接使用AsyncProfiler分析更简单。async-profilergit地址[1]直接从git安装下载。解压后可用。易于使用来执行命令。./profiler.sh-d10-f/tmp/flamegraph.svg./profiler.sh-eitimer-d10-f/tmp/flamegraph.svg可以通过-e指定cpu,alloc,锁,墙,定时器,ClassName.methodName。cpu:在此模式下,探查器收集堆栈跟踪样本,包括Java方法、本机调用、JVM代码和内核函数。alloc:代替检测CPU消耗代码,探查器可以配置为收集分配最大堆内存的调用站点。也就是说,检查当前分配最多内存的位置。lock:满意的锁定尝试,包括Java对象监视器和可重入锁。wall:告诉async-profiler在给定的时间内对所有线程进行平均采样,而不管线程状态:运行、睡眠或阻塞。这可能很有用,例如,在分析应用程序启动时间时。.ClassName.methodName:ClassName.methodName选项使用给定的Java方法,以便使用堆栈跟踪记录此方法的所有调用。cpu:在此模式下,探查器收集堆栈跟踪样本,包括Java方法、本机调用、JVM代码和内核函数。在浏览器中打开file:///tmp/flamegraph.svg,找到调用的API。这里我调用了ProjectManageController中的findProject方法。根据长度我们可以看出这个方法中调用方法的耗时情况,从而知道耗时主要集中在什么地方。PS:如果方法名是编译的,可以在java启动的时候加上-XX:+PreserveFramePointer做更多的工作。用户体验优化是一个漫长而艰巨的过程。为了衡量我们网站的性能是否良好,我们还有更多的工作要做。通常,一些以用户为中心的指标是在底层自定义的,比如Server-Timing[2]。参考文献[1]https://github.com/jvm-profile...\[2]https://w3c.github.io/server-...近期热点文章推荐:1.1,000+Java面试题及答案整理(2022最新版)2.精彩!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!