当前位置: 首页 > 科技观察

前端抱怨API响应慢,怎么办?

时间:2023-03-17 14:08:38 科技观察

请求发送过慢,导致耗时增加;DNS解析过慢,导致耗时增加;网络环境差导致耗时增加;队列一直导致响应缓慢;服务器响应太慢,导致耗时增加;响应量过大导致耗时增加;etc...一般来说,API接口从感官上响应慢,大多数人会直接归咎于服务器处理慢,这其实是不合理的。通过对比内网环境下的API耗时分析和外网环境下的API耗时分析,大致就会明白原因。通过浏览器的开发者工具分析开发者工具,重点关注指标Waiting(TTFB),TTFB代表第一个字节到达的时间。该时间包括一个往返延迟和服务器准备响应所花费的时间。可以近似为服务端的耗时。如果网络不好或者响应数据量过大,ContentDownload的时间会比较长。这时,你应该考虑压缩响应。Timing开发者工具中的Network显示的是当前页面调用的网络资源。点击资源查看资源。Details,其中Timing是调用资源时的耗时情况。排队。【排队】浏览器在以下情况下将请求排队:有更高优先级的请求。已为此源打开六个TCP连接,这是限制。仅适用于HTTP/1.0和HTTP/1.1。浏览器正在磁盘缓存中临时分配空间。停滞不前。【停顿】请求可能因排队中描述的任何原因而停顿。代理协商。【代理协商】浏览器正在与代理服务器协商请求进行协商。请求已发送。[发送请求]正在发送请求。等待(TTFB)。[Waiting]浏览器正在等待响应的第一个字节。TTFB代表第一个字节的时间。此时间包括往返延迟和服务器准备响应所需的时间。内容下载。[响应内容下载]浏览器正在接收响应。其他可能的DNS查找。[DNS]浏览器正在解析请求的IP地址。初始连接。[Initializeconnection]浏览器正在建立连接,包括TCP握手/重试和协商SSL。通过httpstat工具分析httpstat的git地址:https://github.com/reorx/httpstat如果是在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"-v分析服务器通过httpstat工具处理可以近似认为是服务器端的耗时。服务器哪里慢了?打印耗时日志?StopWatchstopWatch=newStopWatch();stopWatch.start();//...stopWatch.stop();LOGGER.info("[某业务]-[时间:{}ms]",stopWatch.getLastTaskTimeMillis());脑子一热就会用的方法,简单直接,但是如果定位不准,可能要加很多这样的日志。让我们用火焰图来可视化软件的执行过程,它是性能分析和调试的利器。生成火焰图的工具有很多,比如AsyncProfiler和linux-perl。方便的。IntelliJIDEA中的火焰图打开火焰图。如果火焰图没有开启,点击+号添加。打开火焰图选择程序,对火焰图进行分析。可以选择一个已经运行的java程序来分析输出火焰图。选择分析火焰图的程序直接使用AsyncProfilerasync-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代码和内核函数。Bash在浏览器中打开file:///tmp/flamegraph.svg,找到调用的API。这里我调用了ProjectManageController中的findProject方法。根据火焰图的长度,我们可以看出这个方法中调用方法的耗时情况,从而可以知道耗时主要集中在哪里。PS:如果方法名是编译的,可以在java启动的时候加上-XX:+PreserveFramePointer做更多的工作。用户体验优化是一个漫长而艰巨的过程。为了衡量我们网站的性能是否良好,我们还有更多的工作要做。通常,一些以用户为中心的指标是在底层自定义的,比如Server-Timing[2]。