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推算及验证

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python教程】4-字符串、列表、字典、元组与集合操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记,稍微整理一下,分享出来,方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术,最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

HTTP参数污染漏洞

HTTP参数污染漏洞 1.HPP漏洞概述2.HPP漏洞利用手段3.参数解析:Flask vs PHP 1.HPP漏洞概述 HTTP参数污染攻击是指通过在HTTP请求中插入多个同名参数,混淆服务器对参数的处理逻辑,进而实现攻击目的。这种攻击可以在URL查询字符串、POST数据和…

AI大模型探索之路-实战篇16:优化决策流程:Agent智能数据分析平台中Planning功能实践

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

MLM之GLM-4-9B:GLM-4-9B的简介、安装和使用方法、案例应用之详细攻略

MLM之GLM-4-9B:GLM-4-9B的简介、安装和使用方法、案例应用之详细攻略 背景痛点:目前主流的大语言模型如GPT-3等,在多轮对话能力、多语言能力、长文本理解能力以及对工具和代码调用能力等方面存在一定限制。 解决方案: >> 在…

现代x86汇编-环境安装

今天端午节,独自在家,翻阅了张银奎老师编写的《现代x86汇编语言程序设计》一书,前言部分说明书中示例代码都是用微软visual C工具编写并使用微软宏汇编(著名的MASM)编译的,好久没有用微软vc了,假…

详解FedProx:FedAvg的改进版 Federated optimization in heterogeneous networks

FedProx:2020 FedAvg的改进 论文:《Federated Optimization in Heterogeneous Networks》 引用量:4445 源码地址: 官方实现(tensorflow)https://github.com/litian96/FedProx 几个pytorch实现:…

基于STM32的595级联的Proteus仿真

文章目录 一、595级联1.题目要求2.思路3.仿真图3.1 未仿真时3.2 模式A3.2 模式B3.3 故障模式 二、总结 一、595级联 1.题目要求 STM32单片机,以及三个LED灯对应红黄绿灯,IIC的OLED显示屏,温湿度传感器DHT11,两个独立按键和两个5…

MySQL时间和日期类型详解(零基础入门篇)

目录 1. DATE 2. DATETIME 3. TIMESTAMP 4. TIME 5. YEAR 6. 日期和时间的使用示例 以下SQL语句的测试可以使用命令行,或是使用SQL工具比如MySQL Workbench或SQLynx等。 在 MySQL 中,时间和日期数据类型用于存储与时间相关的数据,如何…

Python数据分析与建模库-02科学计算库Numpy-3.矩阵属性

该视频主要讲述了线性回归算法的核心思想和应用。首先,回顾了线性回归的基本概念,即通过历史数据学习参数,使得参数与特征组合后拟合效果最佳。接着,介绍了误差项的假设和高斯分布的概念,并推导了如何找到使拟合效果最…

重温共射放大电路

1、放大概念 小功率信号变成一个大功率信号,需要一个核心器件做这件事,核心器件的能量由电源提供,通过核心器件用小功率的信号去控制大电源,来实现能量的转换和控制,前提是不能失真,可以用一系列正弦波进行…

Qt定时器

在 Qt 框架中,定时器是一个非常强大和常用的工具,用于定期执行某些任务。Qt 提供了一些类和方法来实现定时功能,其中最常用的是 QTimer 类。 一、QTimer 概述 QTimer 类是 Qt 中实现定时功能的核心类。它提供了一个简单的接口,用…

Running Gradle task ‘assembleDebug‘ Flutter项目

基于Android方面运行Flutter项目一直卡在 Launching lib\main.dart on Android SDK built for x86 in debug mode… Running Gradle task ‘assembleDebug’… 基础原因: 默认存放Gradle插件包的Maven仓库是国外(需VPN) 我的原因: 缺少JDK和缺少Androi…

【Oracle】Oracle导入导出dmp文件

文章目录 前言一、什么是dmp?二、imp/impdp、exp/expdp对比及示例1.区别2.imp/impdp对比及示例a. impb. impbp 3.exp/expdp对比及示例a. expb.expdp 3.其他事项 三、执行导入导出前置条件1.创建角色并授权2.创建目录映射 前言 在工作中,经常会遇到需要备…

整理好了!2024年最常见 20 道分布式、微服务面试题(八)

上一篇地址:整理好了!2024年最常见 20 道分布式、微服务面试题(七)-CSDN博客 十五、什么是分布式事务,以及如何实现它们? 分布式事务是指在分布式系统中,跨多个节点或资源管理器的一系列操作&…

React中的 Scheduler

为什么需要调度 在 React 中,组件最终体现为 Fiber,并形成 FiberTree,Fiber 的目的是提高渲染性能,将原先的 React 渲染任务拆分为多个小的微任务,这样做的目的是可以灵活的让出主线程,可以随时打断渲染&a…

定个小目标之刷LeetCode热题(10)

这道题属于一道中等题&#xff0c;看来又得背题了&#xff0c;直接看题解吧&#xff0c;有两种解法 第一种动态规划法 状态&#xff1a;dp[i][j] 表示字符串s在[i,j]区间的子串是否是一个回文串 状态转移方程&#xff1a;当s[i] s[j] && (j - i < 2 || dp[i 1]…

纸片战争修改版(重载)

基于上次纸片战争断网版本的修改 http://纸片战争Beta压缩试行.html 不行的话去我的首页下载&#xff0c;搜索“纸片战争”

讨论C++类与对象

讨论C类与对象 C语言结构体和C类的对比类的实例化类对象的大小猜想一猜想二针对上述猜想的实践 this指针不同对象调用成员函数 类的6个默认成员函数构造函数析构函数拷贝构造函数浅拷贝和深拷贝 赋值运算符重载 初始化列表初始化顺序 C语言结构体和C类的对比 在C语言中&#x…

手撸一个java简易聊天室

创建一个Java聊天室涉及到网络编程、多线程处理以及用户界面设计。这里我将提供一个简单的Java聊天室实现&#xff0c;包括服务器端和客户端的基本逻辑。 服务器端 服务器端负责接收客户端的消息&#xff0c;并将其广播给所有连接的客户端。 java 复制 import java.io.; import…

C语言Socket实现Http的post请求

修改三个宏定义即可 #define HOST “192.168.1.133” //主机 #define PORT 80 //端口 #define POST_DATA “post_test444&post_val555” //内容 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include &l…