压力测试(QPS)及测试工具Locust
压力测试:
通常指的是确定接口或服务能够处理的最大请求量(吞吐量)和并发用户数,同时保持合理的响应时间和稳定性。
性能目标
- 最大吞吐量:系统每秒可以处理的请求数。
- 最大并发用户数:系统可以同时支持的用户数。
- 响应时间:系统响应请求的时间。
- 稳定性和可靠性:在高负载下系统的稳定性。
QPS( Queries Per Second,即每秒查询数)
在进行性能测试时,通常会逐步增加并发用户数(或请求频率),以便找到接口或系统的最大QPS值。这个过程中,您会观察到系统的响应时间和请求失败率随着并发量的增加而变化。确定QPS的最大值通常涉及到平衡性能指标和系统的稳定性。
如何确定QPS的最大值
- 响应时间:随着请求量的增加,响应时间可能会增长。您需要确定一个可接受的最大响应时间阈值。当响应时间超过这个阈值时,即使系统还能处理更多请求,也不应该继续增加负载。
- 错误率:随着负载的增加,错误率(包括超时、5XX状态码等)可能会上升。通常,您需要设定一个错误率阈值(例如1%),当错误率超过这个阈值时,可以认为已经达到了系统的性能极限。
- 资源利用率:监控系统的资源利用率(如CPU、内存、网络带宽等)也很重要。资源饱和可能导致性能下降和错误率上升。资源利用率接近或达到100%通常意味着接近系统极限。
综上考虑确定最大QPS:当响应时间超过预定阈值、错误率升高或资源利用率达到饱和时,即认为找到了系统的最大QPS。这是系统在保持良好性能和稳定性的前提下能够处理的最高请求数。
计算QPS
QPS 的计算公式相对简单:
QPS = 总请求次数 / 请求持续时间(秒)
例如,如果一个服务在 10 秒内处理了 2000 个请求,那么:
QPS = 2000 / 10 = 200
这意味着该服务每秒平均处理 200 个请求。
在压力测试中,1个用户每秒请求10000次,与10000个用户每秒请求1次,有什么不同吗?
虽然在表面上看似都产生了每秒 10000 次的请求量,但实际对系统的影响和测试的含义有显著不同:
1. 并发性和资源使用
- 1个用户请求 10000 次:这种情况下,请求是顺序发出的,即使以非常快的速度,也只有一个请求的处理在进行。这种情况测试的是服务对单一用户的高频率请求的处理能力。服务器资源(如数据库连接)可能主要集中在处理这一个用户的请求上,不一定能反映出在多用户并发情况下的资源竞争和分配问题。
- 10000个用户各请求1次:这种情况下,请求是并发发出的,服务器需要同时处理来自一万个不同用户的请求。这种情况测试的是服务的并发处理能力和系统资源(如数据库连接池、内存、CPU)在大量并发请求下的表现。这更接近真实世界的使用场景,能够暴露出服务在高并发下可能遇到的性能瓶颈和问题
2. 会话和状态管理
- 在一个用户高频请求的场景中,如果服务涉及到会话或状态管理,那么这些状态可能会在连续的请求之间保持,影响测试结果。
- 在多用户并发请求的场景中,服务需要管理和维护来自多个用户的会话和状态,这可能揭示出在会话管理、状态一致性等方面的问题。
3. 网络和负载平衡
- 单用户高频请求可能无法充分测试网络的负载均衡和连接限制,因为所有请求可能都通过相同的网络路径和连接进行。
- 多用户并发请求则可能涉及到更多的网络路径和连接,能够测试负载均衡器在分配请求到不同服务器或服务实例时的效果,以及服务在处理来自不同源的请求时的网络性能。
虽然两种情况下每秒的请求量相同,但从测试的目的和重点来看,它们反映了系统不同方面的性能和扩展性。多用户并发请求的测试更能反映真实世界中服务的并发处理能力和资源管理效率,因此在进行压力测试和性能评估时,应该考虑到测试场景与真实使用场景的匹配度。
压力测试工具Locust
一个用 Python 编写的开源负载测试工具,易于编写测试脚本,支持模拟数百万用户并发。
1. 安装 Locust
pip install locust
2. 编写 Locust 测试脚本
创建一个名为 locustfile.py 的 Python 文件,并在文件中定义用户行为和任务。以下是一个基本的测试脚本示例,它模拟用户访问一个 HTTP API:
from locust import HttpUser, between, task
import json
import base64global pic_base64
img_path = './ocr/test_images/1.jpg'
with open(img_path,'rb') as pic:pic_base64 = str(base64.b64encode(pic.read()),encoding='utf-8')class WebsiteUser(HttpUser):host = "http://localhost:8080"wait_time = between(1, 5)@taskdef ocr_task(self):# data = {"img_base64": pic_base64}data = {"key": ["image"], "value": [pic_base64]}headers = {'Content-Type': 'application/json'}self.client.post("/ocr/prediction", data=json.dumps(data), headers=headers)
3. 配置测试参数并运行 Locust
在包含 locustfile.py 的目录下,打开终端并输入以下命令启动 Locust:
locust
这将启动 Locust 的 web 界面,默认情况下访问地址是 http://localhost:8089 。
4. 在 Locust Web 界面中启动测试
打开浏览器,访问 http://localhost:8089 ,然后输入以下信息:
- Number of users:要模拟的用户总数。
- Spawn rate:每秒生成的用户数。这决定了用户以多快的速率启动。
- Host:被测试的网站或应用的基础 URL。
填写完成后,点击 “Start Swarming” 按钮开始测试。
参考链接:https://blog.csdn.net/yuan_ahui/article/details/126272465
相关文章:
压力测试(QPS)及测试工具Locust
压力测试: 通常指的是确定接口或服务能够处理的最大请求量(吞吐量)和并发用户数,同时保持合理的响应时间和稳定性。 性能目标 最大吞吐量:系统每秒可以处理的请求数。最大并发用户数:系统可以同时支持的…...
canal: 连接kafka (docker)
一、确保mysql binlog开启并使用ROW作为日志格式 docker 启动mysql 5.7配置文件 my.cnf [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server-id1一定要确保上述两个值一个为ROW,一个为ON 二、下载canal的run.sh https://github.c…...
45 对接海康视频九宫格的实现
前言 这里主要是 来看一下 海康视频 的一个九宫格播放的需求 然后 在实际使用的过程中产生了一些问题, 比如 增加一个视频, 应该只增量请求这一个视频的服务, 而一些实现下是全量请求了 整个视频列表的服务 另外 就是全屏播放, 如果是 自己写样式来实现 全屏播放, 可能需要 …...
二-容量管理之容量水位
容量水位概念 容量水位(Capacity Level)是指一个系统或服务所使用资源的程度、范围和可承受能力,通常以百分比表示。在容量管理中,容量水位是非常重要的指标,用于衡量系统或服务的健康状况、资源利用率以及未来容量需求。 容量水位通常是根据一些关键指标进行计算,例如…...
计算机网络——数据链路层(差错控制)
计算机网络——数据链路层(差错控制) 差错从何而来数据链路层的差错控制检错编码奇偶校验码循环冗余校验(CRC)FCS 纠错编码海明码海明距离纠错流程确定校验码的位数r确定校验码和数据位置 求出校验码的值检错并纠错 我们今年天来继…...
【搜索引擎1】Ubuntu通过deb方式安装ElasticSearch和Kibana、ik中文分词插件
1、官网下载文件 版本为官网最新版本,ElasticSearch与Kibana版本必须保持一致 ElasticSearch下载地址:Download Elasticsearch | Elastic Kibana下载地址:Past Releases of Elastic Stack Software | Elastic 下载选择DEB文件 ik插件下载…...
1.0 html(1)
html 一、基本介绍 1、定义:html是一种超文本标记语言,也是一种标识性语言(不是编程语言) 标记:记号(绰号) 超文本:就是页面内容可以包含图片、链接,音乐,…...
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
目录 前言 一、掩膜小知识 1、GIS掩膜的实现原理 2、图层掩膜流程 二、使用插件 1、leaflet-mask介绍 2、核心代码解释 三、完整实例实现 1、后台逻辑实现 2、省级行政区划查询实现 3、行政区划定位及掩膜实现 4、成果展示 总结 前言 在之前的博客提过按空间矢量…...
【机器学习之---数学】马尔科夫链
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 马尔科夫 1. 概念 1.1 引言 马尔可夫链在许多领域都有应用,包括物理学、生物学、工程学、经济学和计算机科学等。在计算机科学中࿰…...
教程3_图像的轮廓
目录 目标 1. 特征矩 2、轮廓质心 3. 轮廓面积 4. 轮廓周长 5. 轮廓近似 6. 轮廓凸包 7. 边界矩形 7.1.直角矩形 7.2. 旋转矩形 8. 最小闭合圈 9. 拟合一个椭圆 10. 拟合直线 目标 在本文中,我们将学习 - 如何找到轮廓的不同特征,例如面积&…...
【Linux】-Linux下的编辑器Vim的模式命令大全及其自主配置方法
目录 1.简单了解vim 2.vim的模式 2.1命令模式 2.2插入模式 2.3底行模式 3.vim各模式下的命令集 3.1正常(命令模式下) 3.1.1光标定位命令 3.1.2 复制粘贴 3.1.3 删除 3.1.4 撤销 3.1.5大小写转换 3.1.6替换 「R」:替换光标所到之处的字符&…...
基于SpringBoot和Vue的车辆管理系统的设计与实现
今天要和大家聊的是一款基于SpringBoot和Vue的车辆管理系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕…...
R折线图(自备)
目录 折线图基础 创建散点和折线图 复杂折现加图例 折线图柱状图 数据处理 进行差异检验 基础绘图折线 基础绘图箱线 进行合并 双轴柱状与折线图 数据 折线图基础 创建散点和折线图 rm(list ls()) opar <-par(no.readonlyTRUE)##自带orange数据集 par(mfrowc…...
web学习笔记(四十五)Node.js
目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…...
基于Gabor滤波器的指纹图像识别,Matlab实现
博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…...
55、Qt/事件机制相关学习20240326
一、代码实现设置闹钟,到时间后语音提醒用户。示意图如下: 代码: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(t…...
Clip Converter - 视频在线下载方法
Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…...
【No.19】蓝桥杯简单数论上|模运算|快速幂|GCD|LCM|刷题统计|RSA解密|核桃的数量(C++)
简单数论 模运算 定义:模运算为 a 除以 m 的余数,记为 a mod m,有 a mod m a % m模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,可以把它取模后,缩小数值再…...
区块链安全之DDoS防护的重要性及其实施策略
随着区块链技术的不断发展和广泛应用,其安全问题也日益凸显。其中,分布式拒绝服务(DDoS)攻击是对区块链网络稳定性和效率构成潜在威胁的重要因素之一。本文旨在深入探讨区块链为何需要采取DDoS高防措施,并提出相应的防护策略。 一、区块链面…...
使用Spark单机版环境
在Spark单机版环境中,可通过多种方式进行实战操作。首先,可使用特定算法或数学软件计算圆周率π,并通过SparkPi工具验证结果。其次,在交互式Scala版或Python版Spark Shell中,可以进行简单的计算、打印九九表等操作&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
