QPS,平均时延和并发数
我们当前有两个服务A和B,想要知道哪个服务的性能更好,该用什么指标来衡量呢?
1. 单次请求时延
一种最简单的方法就是使用同一请求体同时请求两个服务,性能越好的服务时延越短,即
R T = 返回结果的时刻 − 发送请求的时刻 RT=返回结果的时刻-发送请求的时刻 RT=返回结果的时刻−发送请求的时刻
单次请求有一个小问题:时延波动太大。请求过程会有网络波动导致的时延,系统调导致的时延波动,如果只看一次请求的结果很明显时不合理的。
2. 多次请求的平均时延
我们可以发送多个请求体,然后计算平均时延。一种很简单的方式就是定时发送,例如每个1秒发送一次请求,连需发送1小时就可以得到3600次返回的结果,最后求平均值
R T = a v g ( 返回结果的时刻 − 发送请求的时刻 ) RT=avg(返回结果的时刻-发送请求的时刻) RT=avg(返回结果的时刻−发送请求的时刻)
通过求平均的方式可以将各种扰动因素保持一致。通常来说我们有各种各样的请求,每条请求处理的时间差异也非常大,所以我们通常会使用平均时延。
req | req1 | req2 | req3 | req4 | req5 | req6 | req7 | req8 | req9 | req10 |
---|---|---|---|---|---|---|---|---|---|---|
rt | 10ms | 20ms | 30ms | 10ms | 1ms | 5ms | 15ms | 50ms | 10ms | 25ms |
a v g ( r t ) = ( 10 + 20 + 30 + 10 + 1 + 5 + 15 + 50 + 10 + 25 ) / 10 avg (rt)=(10+20+30+10+1+5+15+50+10+25) / 10 avg(rt)=(10+20+30+10+1+5+15+50+10+25)/10
3. 并发数
一个小问题是单条请求并不能彻底激发服务的性能,例如A服务只有一个CPU,B服务有10个CPU,很明显B服务性能应该更好,但是由于每次只处理一条请求,导致B服务处理的时候也只使用了一个CPU,其他9个CPU都是空闲的。
如果我们一次发送10条请求呢?A服务只有一个CPU,只能一条一条处理,B服务有10个CPU,一下子就能处理10条请求。假如处理一条请求的平均时延是50ms,A服务处理10条请求就是 10 × 50 m s = 500 m s 10 \times 50ms = 500ms 10×50ms=500ms,而B服务呢?一下子就可以处理10条请求,耗时就是50ms。很明显B服务的性能更好。
服务能同时处理的请求数我们称之为并发数。理论上讲,A只有一个cpu,所以同一时刻只能处理1个请求,而b有10个cpu,同一时刻可以处理10个请求。有一点要注意,我们总共有100个cpu,但是也可以只使用10个cpu,甚至我们可以动态的调整我们使用的cpu个数。
测试的时候我们也会设置一个并发数,这个是客户端并发请求的数量,而不是服务端并发处理的数量,通过调整客户端的并发数,来估计服务端的并发能力。
并发数与cpu的核数,已经使用cpu使用率相关。cpu的核数决定了最多可以同时处理多少条请求,cpu的使用率则表明当前cpu处理请求的时间占比。例如第一个cpu,只有30%的时间在处理请求,第三个cpu则100%的时间都在处理请求。如果平均来看
使用率 = 0.3 + 0.6 + 1 + 0 4 = 47.5 % 使用率=\frac{0.3+0.6+1+0}{4}=47.5\% 使用率=40.3+0.6+1+0=47.5%
比较好理解,30%的利用率相当于使用了0.3个核,60%的利用率使用了0.6个核,100%的利用率则使用了1个核,所以总共使用了 0.3 + 0.6 + 1 + 0 = 1.9 0.3+0.6+1+0=1.9 0.3+0.6+1+0=1.9个核,总共有4个核,所以使用率就是1.9/4=47.5%,我们可以认为
并发数 = cpu核数 × cpu利用率 并发数=\text{cpu核数} \times \text{cpu利用率} 并发数=cpu核数×cpu利用率
4. QPS
假如a服务有1个型号为i7的cpu,处理每条请求的时延是10ms,那么1s内就可以处理100条请求,b服务有10个型号为i3的cpu,每个cpu处理一条请求的时延是100ms,那么b服务每个cpu在1s内能处理10个请求,10个cpu并行的话,1s就可以处理100个请求。对于客户端来说,a服务和b服务1s内处理的请求数量是一样多的,所以认为他们的性能也是一样的。
认为cpu型号,个数不同不能对比?对于客户端(老板)来说无所谓的,反正我就给那么多钱让你搭建服务,你可以买1个性能强劲的i7,也可以买多个性能弱鸡的i3。只要能支持足够的访问就可以了。性价比是我们后续优化要考虑的。
我们假设服务的并发数是n,即同时可以处理n条请求,单并发处理每一条请求的时延是rt,那么1s就可以处理的请求数为
1 s 处理请求数 = 1 单并发 R T × 并发数 1s处理请求数=\frac{1}{单并发 RT} \times 并发数 1s处理请求数=单并发RT1×并发数
1s内处理的请求数我们称之为QPS,根据上面并发数与cpu使用率的关系可知
Q P S = 1 s 单并发 RT × cpu核数 × cpu利用率 QPS=\frac{1s}{\text{单并发 RT}} \times \text{cpu核数} \times \text{cpu利用率} QPS=单并发 RT1s×cpu核数×cpu利用率
qps越高说明有限的时间内可以处理更多的请求,服务的性能也就越好。
5. 例子
再举几个小例子来说明这个公式,假设cpu的使用率都是100%
- 服务a有3个核,处理一条请求的平均时延是50ms,qps=3/0.05=60
- 服务b有4个核,qps是80,平均时延就是rt=4/80=50ms
- 服务c的qps是80,平均时延是100ms,并发数就是80*0.1=8
- 服务d的并发数是2,平均时延是10s,那么qps就是2/10=0.2,也就是说1s只能处理0.2个请求,处理一个请求就需要5秒。
6. 小困惑
一开始我们想要比较两个服务的时延来估计出哪个服务的性能更好,后来得到了时延与QPS的关系,QPS越高服务性能也就越好。实际生产中有高峰低谷,高峰期QPS可能是500,低峰期的QPS可能只有100,同一个服务为什么QPS为什么会不相同呢?
其实这是因为请求量不同导致的QPS变化,例如满负载的情况下一个服务的QPS=50,也就是说1s内最多只能处理50条请求,如果有5个核,那么每个核1s可以处理10条请求,每条请求耗时100ms。
但是如果这1s内只有15个请求呢?那其实只需要1.5个核就可以处理完成了。cpu利用率为1.5/5=30%,所以
Q P S = 1 0.1 × 5 × 0.3 = 15 QPS=\frac{1}{0.1} \times 5 \times 0.3=15 QPS=0.11×5×0.3=15
我们发现单并发时延并没有变化,但是cpu的使用率变了,所以qps也发生了变化。因此我们优化性能后,要在同cpu负载率的情况下比较QPS才行。
服务端性能优化–最大QPS推算及验证
相关文章:

QPS,平均时延和并发数
我们当前有两个服务A和B,想要知道哪个服务的性能更好,该用什么指标来衡量呢? 1. 单次请求时延 一种最简单的方法就是使用同一请求体同时请求两个服务,性能越好的服务时延越短,即 R T 返回结果的时刻 − 发送请求的…...

【Python核心数据结构探秘】:元组与字典的完美协奏曲
文章目录 🚀一、元组⭐1. 元组查询的相关方法❤️2. 坑点🎬3. 修改元组 🌈二、集合⭐1. 集合踩坑❤️2. 集合特点💥无序性💥唯一性 ☔3. 集合(交,并,补)🎬4. …...

Golang | Leetcode Golang题解之第137题只出现一次的数字II
题目: 题解: func singleNumber(nums []int) int {a, b : 0, 0for _, num : range nums {b (b ^ num) &^ aa (a ^ num) &^ b}return b }...
Spring和SpringBoot的特点
1.Spring的特点 1.IOC和AOP是Spring的两大核心特性,即控制反转和依赖注入。 2.松耦合:IOC和AOP两大特性可以尽可能地将对象之间的关系解耦 3.可配置:提供外部化配置的方式,可以灵活地配置容器及容器中的Bean 4.一站式:…...
怎么使用join将数组转为逗号分隔的字符串
在JavaScript中,你可以使用Array.prototype.join()方法将一个数组转换为逗号分隔的字符串。join()方法接受一个可选的参数,该参数指定了数组元素之间的分隔符。如果不提供参数,则默认使用逗号(,)作为分隔符。 下面是一…...
Web前端博客论坛:构建、运营与用户体验的深度解析
Web前端博客论坛:构建、运营与用户体验的深度解析 在数字化浪潮的推动下,Web前端博客论坛成为了广大开发者交流技术、分享经验的重要平台。如何构建一个功能齐全、运营有序的博客论坛,以及如何提升用户体验,是摆在每一位前端开发…...

Java从入门到放弃
线程池的主要作用 线程池的设计主要是为了管理线程,为了让用户不需要再关系线程的创建和销毁,只需要使用线程池中的线程即可。 同时线程池的出现也为性能的提升做出了很多贡献: 降低了资源的消耗:不会频繁的创建、销毁线程&…...

基于51单片机的车辆动态称重系统设计
一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…...

C语言之常用字符串函数总结、使用和模拟实现
文章目录 目录 一、strlen 的使用和模拟实现 二、strcpy 的使用及模拟实现 三、strcat 的使用和模拟实现 四、strcmp 的使用和模拟实现 五、strncpy 的使用和模拟实现 六、strncat 的使用和模拟实现 七、strncmp 的使用和模拟实现 八、strstr 的使用和模拟实现 九、st…...

【JMeter接口测试工具】第二节.JMeter项目实战(上)【实战篇】
文章目录 前言项目实战零、接口测试流程一、测试数据准备二、接口功能测试三、掌握测试用例编写四、自动化脚本架构搭建总结 前言 零、接口测试流程 1、制定测试计划,分配任务 2、从 API 文档中提取接口清单:对 API 文档简化,提高测试效率,接口清单就是对 API 文档…...
Ansible——fetch模块
目录 参数 示例1:最基本的用法 示例2:指定目标目录和主机名子目录 示例3:flat 参数设置为 yes 示例4:处理源文件不存在的情况 示例5:验证文件校验和 示例 Playbook 1. 拉取远程主机上的 syslog 文件 2. 直接…...
HTTP常见响应状态码
1xx:正在处理中 100 Continue:服务器确认收到了请求的第一部分,并告知客户端继续发送剩余的请求。 101 Switching Protocols:服务器根据客户端的请求,同意切换到另一个协议。 2xx:成功响应 200 OK&#…...

如何制定工程战略
本文介绍了领导者如何有效制定工程战略,包括理解战略核心、如何收集信息并制定可行的策略,以及如何利用行业最佳实践和技术债务管理来提升团队效能和产品质量。原文: How to Build Engineering Strategy 如果你了解过目标框架(如 OKR…...

认识和使用 Vite 环境变量配置,优化定制化开发体验
Vite 官方中文文档:https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下: {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…...
Java18新特性总结
Java 18作为Java编程语言的一个重要更新,引入了一系列新特性和改进,旨在提高开发者的生产力和程序的性能。以下是Java 18的主要新特性概述: 元编程功能: Java 18引入了元注释和元类型声明的功能,允许开发人员在编译时…...

理解 Java 中的 `final` 关键字
理解 Java 中的 final 关键字 final 关键字是 Java 编程语言中一个重要的修饰符,它可以应用于类、方法和变量。理解 final 的用法和作用对于编写稳健和高效的 Java 代码至关重要。在本文中,我们将深入探讨 final 关键字的各种用法及其意义。 一、final…...

磁盘未格式化:深度解析、恢复方案及预防之道
在当今这个信息化爆炸的时代,磁盘未格式化问题无疑成为了众多用户头疼的难题。当我们的存储设备突然提示“磁盘未格式化”时,数据的丢失与恢复的挑战便摆在了我们面前。本文将深入解析磁盘未格式化的现象、原因,并给出两种有效的数据恢复方案…...

JWT 从入门到精通
什么是 JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案 JSON Web Token Introduction - jwt.ioLearn about JSON Web Tokens, what are they, how they work, when and why you should use them.https://jwt.io/introduction 一、常见会…...

31-捕获异常(NoSuchElementException)
在定位元素的时候,经常会遇到各种异常,遇到异常又该如何处理呢?本篇通过学习selenium的exceptions模块,了解异常发生的原因。 一、发生异常 打开百度搜索首页,定位搜索框,此元素id"kw"。为了故意…...
使用Spring Boot设计对象存储系统
对象存储系统是一种以对象为存储单位的存储架构,适合存储大量非结构化数据,如图片、音视频文件、文档等。MinIO是一个高性能的对象存储系统,基于开源和云原生的设计理念。本文将讨论如何使用Spring Boot设计一个类似MinIO的对象存储系统。 目…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...