当前位置: 首页 > news >正文

QPS,平均时延和并发数

我们当前有两个服务A和B,想要知道哪个服务的性能更好,该用什么指标来衡量呢?

1. 单次请求时延

一种最简单的方法就是使用同一请求体同时请求两个服务,性能越好的服务时延越短,即
R T = 返回结果的时刻 − 发送请求的时刻 RT=返回结果的时刻-发送请求的时刻 RT=返回结果的时刻发送请求的时刻
单次请求有一个小问题:时延波动太大。请求过程会有网络波动导致的时延,系统调导致的时延波动,如果只看一次请求的结果很明显时不合理的。

2. 多次请求的平均时延

我们可以发送多个请求体,然后计算平均时延。一种很简单的方式就是定时发送,例如每个1秒发送一次请求,连需发送1小时就可以得到3600次返回的结果,最后求平均值
R T = a v g ( 返回结果的时刻 − 发送请求的时刻 ) RT=avg(返回结果的时刻-发送请求的时刻) RT=avg(返回结果的时刻发送请求的时刻)
通过求平均的方式可以将各种扰动因素保持一致。通常来说我们有各种各样的请求,每条请求处理的时间差异也非常大,所以我们通常会使用平均时延。

reqreq1req2req3req4req5req6req7req8req9req10
rt10ms20ms30ms10ms1ms5ms15ms50ms10ms25ms

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.一站式&#xff1a…...

怎么使用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&#xf…...

认识和使用 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的对象存储系统。 目…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...