HTTP请求性能分析 - 简单

使用随手可得的工具,尽量少的前置要求,来完成任务。

0. 目录

    • 1. 前言
    • 2. 分析工具
      • 2.1 基于Chrome DevTools 的Timing
        • 2.1.1 关于Network标签页下的Timing部分
        • 2.1.2 一些注意项
      • 2.2 基于Curl 命令
    • 3. 剩下的工作

1. 前言

对于业务开发选手而言,一般的功能性需求都不会是问题,所谓的"数据库套壳"操作。

而诸如系统性能,易用性等非功能性需求因为场景的问题,对于一般的业务开发选手而言,往往并没有多少实际的经验。

本文尝试提供一个起点,就是在没有多少性能调优经验时,如何起步 —— 首先从测量开始,毕竟"no measure,no improve"。

  1. 本文的主要受众是初次接触"HTTP请求性能调优"的同学。
  2. 因此这里不会介绍什么基于metrics的分析,相较于整体的理论介绍和实践,我们更关心的是业务场景下的快速解决问题。
  3. HTTP请求性能涉及到从最开始浏览器端发起的请求,中间途径的网络,后端的请求处理,以及最终返回给浏览器这一整条链路,导致问题的原因有很多,我们重点关注如何通过尽量简单的工具和操作,来缩小问题范围、最快地定位出导致问题的主要原因

2. 分析工具

2.1 基于Chrome DevTools 的Timing

这里我们使用截取的一个样例进行示范:
在这里插入图片描述

先说结论: 以上请求响应的性能不及预期,主要瓶颈是在后端服务的处理上(“WATING(TTFB)”),接下来我们需要针对性对后端进行链路段的细化,以确定最终的桎梏点。

2.1.1 关于Network标签页下的Timing部分

在Chrome的DevTools工具中,Network标签页下的Timing部分提供了有关网络请求的详细时间信息。以下是Timing各个字段的解读:

StageExplain
Queueing1. “Queuing”(排队)是指网络请求在等待发送到服务器之前所处的状态。具体来说,当浏览器发送请求时,如果存在排队的请求或者请求队列已满,新的请求将进入"Queuing"状态,等待前面的请求完成或者队列空闲。
2. "Queuing"状态的时间是**"Blocked"时间的一部分**,表示请求在浏览器内核的请求队列中等待的时间。它通常反映了请求在发送给服务器之前由于资源限制而被阻塞的情况,例如并发连接数限制或请求队列已满。
3. 在性能分析中,"Queuing"状态的时间可以帮助您确定是否存在请求排队或请求队列限制的瓶颈。如果看到较长的"Queuing"时间,可能意味着请求队列过长或并发连接数设置过低,导致请求需要等待较长时间才能发送到服务器。您可以尝试优化并发连接数的配置或增加请求队列的容量,以改善请求的性能和响应时间。

注:Blocked时间: 请求发出时,等待在浏览器内核的请求队列中等待的时间(单位:毫秒)。
Stalled1. “Stalled”(阻塞)是指网络请求在等待可用的连接资源时所处的状态。具体来说,当浏览器尝试发起网络请求时,如果没有可用的连接资源(例如,无可用的连接池或达到了最大并发连接数),请求将进入"stalled"状态,并等待可用的连接资源。
2. "stalled"状态的时间是**"Blocked"时间的一部分**,表示请求在浏览器内核的请求队列中等待的时间。它通常反映了资源请求受限于可用连接资源的情况,可能由于网络延迟、连接池限制或其他因素导致。
3. 在分析性能问题时,"stalled"状态的时间可以帮助您确定是否存在连接资源的瓶颈,例如并发连接数设置过低或网络延迟较高等。您可以尝试优化连接资源的配置或调整并发连接数的限制,以改善请求的性能和响应时间。
4. 如果stalled过长,说明获取连接耗时长,如果用的是http/1.1可以升级到http2,合并请求,尽量减少请求数。
DNS Lookup进行DNS解析的时间,即将主机名解析为IP地址的时间(单位:毫秒)
Initial connection建立TCP连接所花费的时间(单位:毫秒)
Proxy negotiation
Request sent发送请求到服务器的时间,包括请求头和请求体的传输时间(单位:毫秒)
ServiceWorker Preparation
Request to ServiceWorker
Waiting (TTFB)1. 关键指标
2. 这是指
从请求发送完毕到接收到服务器返回的第一个字节所经过的时间
,也称为"Time To First Byte"(单位:毫秒)。
3. 它表示了服务器响应的延迟时间,包括了网络延迟和服务器处理时间
4. 如果这一部分慢,说明服务器处理慢
Content Download1. 关键指标
2. 这是指
下载响应内容的时间

3. 它包括了从接收到服务器响应的第一个字节到下载完整响应内容所花费的时间
4. 如果这个值超出预期,说明请求返回的内容很大,或者网络延迟比较明显,或者浏览器当前忙于处理其他任务
Receiving PushHTTP2相关
Reading Push

参考:

  1. Chrom官方文档 - timing-explanation
  2. chrome浏览器中的Timing详解 – 临时找的一篇,但解释得很清楚

2.1.2 一些注意项

  1. 注意Queueing Stage 对于最终请求耗时统计的影响,有的时候在DevTools下看到请求响应慢,可能并不是后端处理慢导致的,而是因为前端发起的请求过多(短时间内远超出"六个"的限制)等其他原因。排查问题的时候方向千万不能错。

如下面这个截图里, 绿色代表请求发出,灰色代表浏览器让该请求处于Blocked状态,还没有真正进入向后端发送(“Request sent”)阶段。
绿色代表请求发出,灰色代表浏览器让该请求处于停止状态

2.2 基于Curl 命令

除了直观地使用chrome devtools之外,另外一个方便使用就是curl命令了。(curl基本属于linux默认安装的命令,另外windows下也有相对应的第三方工具:curl -download)

以下代码我直接借鉴自下方给出的参考链接。为了避免抄袭之嫌,这里我只给出我个人认为需要额外说明的,更多的细节读者可以直接阅读对应的链接。

# 参考: https://www.zhihu.com/question/551074980/answer/3159565281
curl -o /dev/null  -s -w '@curl-w.txt' https://www.zhihu.com

# 其中的 curl-w.txt 为预先创建的, 位于当前目录下:
           DNS解析时长:%{time_namelookup}s\n
           建立TCP时长:%{time_connect}s\n
    请求到服务器响应时长:%{time_pretransfer}s\n
 请求到服务器开始传输时长:%{time_starttransfer}s\n
                总时长:%{time_total}s\n
              上传速度:%{speed_upload} B/s\n
              下载速度:%{speed_download} B/s\n
              
# 以上参数说明: ( 服务器处理耗时 = time_starttransfer - time_pretransfer )
time_namelookup	       DNS 域名解析的耗时
time_connect	       TCP 连接三次握手的时间
time_appconnect	       SSL/SSH 等上层协议建立连接的时间
time_redirect	       所有重定向步骤所用的时间
time_pretransfer	   请求开始到服务器响应的时间
time_starttransfer	   请求开始到第一个字节将要传输的时间(包括预传输时间和服务器处理结果所需的时间)
time_total	           请求总时间

参考:

  1. Chrom官方文档 - timing-explanation

3. 剩下的工作

正如开盘提及的,以上介绍的方法只能用于缩小导致问题原因的范围,比如是前端请求的问题,浏览器限制,亦或是网络问题,还是后端处理慢的问题等。

当问题被缩小后,我们还需要针对性地结合链路追踪或者补充日志记录,以及经验判断,来最终定位问题。

虽然本文里列举的方法无法帮助你最终定位问题,但因为其简单、便捷、学习门槛低的特性,可以显著降低你在面临问题时候的焦虑感,面对问题时候有所依凭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/71603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vision Transformer模型入门

Vision Transformer模型入门 一、Vision Transformer 模型1,Embedding 层结构详解2,Transformer Encoder 详解3,MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…

无涯教程-Perl - getprotobynumber函数

描述 此函数在标量context中将协议NUMBER转换为其对应的名称,在列表context中将其名称和相关信息转换为:($name,$aliases,$protocol_number)。 语法 以下是此函数的简单语法- getprotobynumber NUMBER返回值 此函数针对错误返回undef,否则返回标量context中的协议编号,并在…

HBase API

我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的&#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目&#xff0c;导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

Java中创建线程三种方式

继承Thread类创建线程实现Runnable接口创建线程使用Callable和Future创建线程 继承Thread类 /*** 使用集成Thread的方式实现多线程*/ public class Match1 {public static void main(String[] args) {Runner liuxiang new Runner();//创建一个新的线程liuxiang.setName(&quo…

当执行汇编指令MOV [0001H] 01H时,CPU都做了什么?

今天和几位单位大佬聊天时&#xff0c;讨论到一个非常有趣的问题-当程序执行MOV [0001H], 01H计算机实际上都做了哪些工作&#xff1f;乍一看这个问题平平无奇&#xff0c;CPU只是把立即数01H放在了地址为0001的内存里&#xff0c;但仔细想想这个问题远没有那么简单&#xff0c…

matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法

总结和记录一下matlab求解常微分方程常用的数值解法&#xff0c;本文先从欧拉法和改进的欧拉法讲起。 d x d t f ( x , t ) , x ( t 0 ) x 0 \frac{d x}{d t}f(x, t), \quad x\left(t_{0}\right)x_{0} dtdx​f(x,t),x(t0​)x0​ 1. 前向欧拉法 前向欧拉法使用了泰勒展开的第…

基于grpc从零开始搭建一个准生产分布式应用(2) - 工程构建

开始本章之前默认读者已经配置好了以下环境&#xff1a;Intellij IDEA 2022.1.2、JDK 1.8.0_144、Maven 3&#xff0c;另外也建议大家在一些免费代码托管平台开个帐号&#xff0c;这样就可以免费使用git做版本处理了&#xff0c;笔者自己私人使用的是阿里云的云效平台。因为此专…

Docker安装ElasticSearch/ES 7.4.0

目录 前言安装ElasticSearch/ES安装步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3&#xff1a;创建容器创建容器方…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 1、执行make menuconfig&#xff0c;将http头由512改为更大的值&#xff0c;否则用电脑浏览器访问正常&#xff0c;但用手机浏览器访问会因为ht…

idea双击启动无效,idea卡顿问题

idea双击启动无效&#xff1a;大概率是关机时没有正确关闭idea&#xff0c;再次开机导致无法正常启动idea 1.通过任务管理器杀死idea进程后重启idea 2.需要修改配置 打开 &#xff08;以各自电脑实际为准&#xff09;C:\Program Files\JetBrains\IntelliJ IDEA 2020.3.1\bin&am…

ECS服务器安装docker

​ 为了安装并配置 Docker &#xff0c;你的系统必须满足下列最低要求&#xff1a; 64 位 Linux 或 Windows 系统 如果使用 Linux &#xff0c;内核版本必须不低于 3.10 能够使用 sudo 权限的用户 在你系统 BIOS 上启用了 VT&#xff08;虚拟化技术&#xff09;支持 on your s…

StarRocks企业级数据库

第1章 StarRocks简介 1.1 StarRocks介绍 StarRocks是新一代极速全场景MPP数据库 StraRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全新功能&…

进程间通信(IPC)的几种方式

进程间通信&#xff08;IPC&#xff09; 1.常见的通信方式2.低级IPC方法文件 3.常用于本机的IPC机制3.1无名管道pipe3.2命名管道FIFO3.3消息队列MessageQueue3.4共享内存SharedMemory3.5信号量Semaphore3.6信号Signal3.7unix域套接字 4.不同计算机上的IPC机制5.IPC机制的数据拷…

用友-NC-Cloud远程代码执行漏洞[2023-HW]

用友-NC-Cloud远程代码执行漏洞[2023-HW] 一、漏洞介绍二、资产搜索三、漏洞复现PoC小龙POC检测脚本: 四、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

网络防御之SSL VPN

1. SSL工作过程是什么&#xff1f; 第一阶段&#xff1a; 客户端发送client hello消息到服务端&#xff0c;服务端收到client hello消息后&#xff0c;再发送server hello消息到客户端。 第二阶段&#xff1a; 服务器的证书&#xff0c;用于客户端给客户端发送信息时加密 serv…

最新智能AI系统+ChatGPT源码搭建部署详细教程+知识库+附程序源码

近期有网友问宝塔如何搭建部署AI创作ChatGPT&#xff0c;小编这里写一个详细图文教程吧。 使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 增加手机端签到功能、优化后台总计绘画数量逻辑&#xff01;新增 MJ 官方图片重新生成指令功能同步官方 …

Apollo让自动驾驶如此简单

前言&#xff1a; 最近被新能源的电价闹的不行&#xff0c;买了电车的直呼上当了、不香了。但电车吸引人不只是公里油耗低&#xff0c;还有良好的驾车使用感。比如辅助驾驶、甚至是自动驾驶。今天来介绍一个头部自动驾驶平台Apollo&#xff0c;Apollo是一个开源的、自动驾驶的软…

mac安装vscode 配置git

1、安装vscode 官网地址 下载mac稳定版安装很慢的解决办法 (转自) mac电脑如何解决下载vscode慢的问题 选择谷歌浏览器右上角的3个点&#xff0c;选择下载内容&#xff0c;右键选择复制链接地址&#xff0c;在新窗口粘贴地址&#xff0c; 把地址中的一段替换成下面的vscode.cd…

06_Hudi案例实战

本文来自"黑马程序员"hudi课程 6.第六章 Hudi案例实战 6.1 案例架构 6.2 业务数据 6.2.1 消息数据格式 6.2.2 数据生成 6.3 七陌数据采集 6.3.1 Apache Flume 是什么 6.3.2 Apache Flume 运行机制 6.3.3 Apache Flume 安装部署 6.3.4 Apache Flume 入门程序 6.3.5 七…

Linux 终端命令之文件浏览(3) less

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…