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"。
- 本文的主要受众是初次接触"HTTP请求性能调优"的同学。
- 因此这里不会介绍什么基于metrics的分析,相较于整体的理论介绍和实践,我们更关心的是业务场景下的快速解决问题。
- HTTP请求性能涉及到从最开始浏览器端发起的请求,中间途径的网络,后端的请求处理,以及最终返回给浏览器这一整条链路,导致问题的原因有很多,我们重点关注如何通过尽量简单的工具和操作,来缩小问题范围、最快地定位出导致问题的主要原因。
2. 分析工具
2.1 基于Chrome DevTools 的Timing
这里我们使用截取的一个样例进行示范:
先说结论: 以上请求响应的性能不及预期,主要瓶颈是在后端服务的处理上(“WATING(TTFB)”),接下来我们需要针对性对后端进行链路段的细化,以确定最终的桎梏点。
2.1.1 关于Network标签页下的Timing部分
在Chrome的DevTools工具中,Network标签页下的Timing部分提供了有关网络请求的详细时间信息。以下是Timing各个字段的解读:
Stage | Explain |
---|---|
Queueing | 1. “Queuing”(排队)是指网络请求在等待发送到服务器之前所处的状态。具体来说,当浏览器发送请求时,如果存在排队的请求或者请求队列已满,新的请求将进入"Queuing"状态,等待前面的请求完成或者队列空闲。 2. "Queuing"状态的时间是**"Blocked"时间的一部分**,表示请求在浏览器内核的请求队列中等待的时间。它通常反映了请求在发送给服务器之前由于资源限制而被阻塞的情况,例如并发连接数限制或请求队列已满。 3. 在性能分析中,"Queuing"状态的时间可以帮助您确定是否存在请求排队或请求队列限制的瓶颈。如果看到较长的"Queuing"时间,可能意味着请求队列过长或并发连接数设置过低,导致请求需要等待较长时间才能发送到服务器。您可以尝试优化并发连接数的配置或增加请求队列的容量,以改善请求的性能和响应时间。 注:Blocked时间: 请求发出时,等待在浏览器内核的请求队列中等待的时间(单位:毫秒)。 |
Stalled | 1. “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 Download | 1. 关键指标 。 2. 这是指下载响应内容的时间。 3. 它包括了从接收到服务器响应的第一个字节到下载完整响应内容所花费的时间 4. 如果这个值超出预期,说明请求返回的内容很大,或者网络延迟比较明显,或者浏览器当前忙于处理其他任务 |
Receiving Push | HTTP2相关 |
Reading Push |
参考:
- Chrom官方文档 - timing-explanation
- chrome浏览器中的Timing详解 – 临时找的一篇,但解释得很清楚
2.1.2 一些注意项
- 注意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 请求总时间
参考:
- Chrom官方文档 - timing-explanation
3. 剩下的工作
正如开盘提及的,以上介绍的方法只能用于缩小导致问题原因的范围,比如是前端请求的问题,浏览器限制,亦或是网络问题,还是后端处理慢的问题等。
当问题被缩小后,我们还需要针对性地结合链路追踪或者补充日志记录,以及经验判断,来最终定位问题。
虽然本文里列举的方法无法帮助你最终定位问题,但因为其简单、便捷、学习门槛低的特性,可以显著降低你在面临问题时候的焦虑感,面对问题时候有所依凭。
相关文章:

HTTP请求性能分析 - 简单
使用随手可得的工具,尽量少的前置要求,来完成任务。 0. 目录 1. 前言2. 分析工具2.1 基于Chrome DevTools 的Timing2.1.1 关于Network标签页下的Timing部分2.1.2 一些注意项 2.2 基于Curl 命令 3. 剩下的工作 1. 前言 对于业务开发选手而言,…...

腾讯云标准型CVM云服务器详细介绍
腾讯云CVM服务器标准型实例的各项性能参数平衡,标准型云服务器适用于大多数常规业务,例如:web网站及中间件等,常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格,腾讯云服务器网来详细说下云服务器CVM标准…...

基于DEM tif影像的插值平滑和tif纹理贴图构建方法
准备数据是一个10米分辨率的Tif影像,直接用于生成DEM会十分的不平滑。如下图所示,平滑前后的对比效果图差异: 基于ArcGIS的DEM平滑插值 等值线生成(指定加密间距) 平滑线(指定平滑容差平滑等高线࿰…...
Redis_五种数据类型及操作命令
5.redis常用的五种数据类型 5.1 Redis String字符串 5.1.1 简介 String类型在redis中最常见的一种类型string类型是二制安全的,可以存放字符串、数值、json、图像数据value存储最大数据量是512M 5.1.2 常用命令 set < key>< value>:添加…...

Mac如何打开隐藏文件中Redis的配置文件redis.conf
Redis下载(通过⬇️博客下载的Redis默认路径为:/usr/local/etc) Redis下载 1.打开终端进入/usr文件夹 cd /usr 2.打开/local/文件夹 open local 3.找到redis.conf并打开,即可修改配置信息...

nginx+flask+uwsgi部署遇到的坑
文章目录 1.环境:2.uwsgi_conf.ini具体配置内容3.nginx 具体配置4.具体命令(注意使用pip3命令安装)5.服务异常排查 1.环境: centos8 uWSGI 2.0.22 gmssl 3.2.2 nginx version: nginx/1.18.0 项目目录: 2.uwsgi_conf.ini具体配置内容 [uws…...

vue实现pdf预览功能
背景:材料上传之后点击预览实现在浏览器上预览的效果 效果如下: 实现代码如下: //预览和下载操作 <el-table-column fixed"right" label"操作" width"210"><template #default"scope">…...

(原创)Flutter与Native页面互相跳转
前言 实际开发混合项目时,常常会有页面跳转的需求 如果是原生界面和flutter界面需要互相跳转 这种情况应该怎么处理呢? 今天这篇博客主要就来介绍下这个情况 其实想一下,这个问题可以拆成四个小的问题来分析: 1:原生界…...

web集群学习--基于CentOS构建LVS-DR集群、配置nginx负载均衡
基于CentOS构建LVS-DR集群 环境准备 主机名 ip地址 node1 192.168.1.140 client node2 192.168.1.141 LVS node3 192.168.1.142 RS1 node4 192.168.1.143 RS2配置 1.关闭防火墙和SELinux [rootclient~]# systemctl stop firewalld [rootclient~]# systemctl disabl…...

基于 FPGA 的电机控制
FPGA 非常适合精密电机控制,在这个项目中,我们将创建一个简单的电机控制程序,在此基础上可以构建更复杂的应用。 需要的硬件 Digilent Pmod HB3 介绍 我们可以用一个简单的 8 位微控制器来控制电机,输出一个简单的脉宽调制波形。然…...

STM32F429IGT6使用CubeMX配置IIC通信(AT2402芯片)
1、硬件电路 写地址:0xA0 读地址:0xA1 存储容量:256Byte 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置IIC 4、生成工程配置 5、部分代码 #define IIC_WRITE_ADDR 0xA0 // IIC写地址 #define IIC_READ_ADDR 0xA1 …...

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变
文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…...
学cpp看的那点书
C C Primer 语言基础学习 C Templates The Complete Guide (2nd Edition) 学习模板,更好的阅读 STL 源码,毕竟C 标准库大部分是模板。 The C Standard Library 全称 The C Standard Library A Tutorial and Reference Second Edition简单的了解标…...

【C++】常用容器-string容器
1.string基本概念 2.string构造函数 #include <iostream> using namespace std;//string容器 void test01() {string s1;//创建空字符串,调用无参构造函数cout << "str1 " << s1 << endl;//什么都不输出const char* str "…...

SSH无法连接kali,拒绝密码
1,cd /etc/ssh 2,systemctl start ssh.server 3,vim /etc/ssh/sshd_config 将黄色文字改成这样 4,systemctl restart ssh 然后去连接就好了...

竞赛项目 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习
文章目录 0 简介1 课题背景🚩 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率(Accuracy)3.2 精确率(Precision)和召回率(Recall)3.3 平均精…...

redis 数据结构(一)
Redis 为什么那么快 redis是一种内存数据库,所有的操作都是在内存中进行的,还有一种重要原因是:它的数据结构的设计对数据进行增删查改操作很高效。 redis的数据结构是什么 redis数据结构是对redis键值对值的数据类型的底层的实现,…...

【高频面试题】JVM篇
文章目录 一、JVM组成1.什么是程序计数器2.什么是Java堆?3.能不能介绍一下方法区(元空间)4.你听过直接内存吗5.什么是虚拟机栈6.垃圾回收是否涉及栈内存?7.栈内存分配越大越好吗?8.方法内的局部变量是否线程安全?9.什么…...

第十三次CCF计算机软件能力认证
第一题:跳一跳 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。 简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上,但没有跳到方块的…...

无人驾驶实战-第十二课(强化学习自动驾驶系统)(完)
在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 强化学习ÿ…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...