性能:你知道并发用户数应该怎么算吗

2023-05-16

我们知道,一个性能测试中,往往会有各种各样的指标,比如TPS、RPS、QPS、HPS、CPM等。我们在实际工作的时候,应该对这些概念有统一的认识。
在这里插入图片描述
建议使用TPS作为关键的性能指标。另外,TPS中的T要根据实际的业务产生变化

那么,问题又来了,TPS和并发数是什么关系呢?在并发中谁来承载“并发”这个概念呢?

这里,我们必须要先区分一下“绝对并发”和“相对并发”这两个概念

  • 绝对并发指的是同一时刻的并发数
  • 相对并发指的是一个时间段内发生的事情

什么是并发

下面我们就来说一下“并发”这个概念。
在这里插入图片描述
我们假设上图中的这些小人是严格按照这个逻辑到达系统的,那显然,系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数,那就是 16。是不是显而易见?

但是,在实际的系统中,用户通常是这样分配的:
在这里插入图片描述
也就是说,这些用户会分布在不同的服务、网络等对象中。这时候“绝对并发”这个概念就难以描述了,你说的是哪部分的绝对并发呢?

要说积分服务,那是 2;要说库存服务,那是 5;要说订单服务,它自己是 5 个请求正在处理,但同时它又 hold 住了 5 个到库存服务的链接,因为要等着它返回之后,再返回给前端。所以将绝对并发细分下去之后,你会发现头都大了,不知道要描述什么了。

有人说,我们可以通过CPU啊,IO啊,或者内存来描述绝对并发,来看CPU在同一时刻处理的任务数。如果是这样的话,绝对并发还用算吗?那肯定是CPU的个数呀。有人说,CPU 1ns 就可以处理好多个任务了,这里的 1ns 也是时间段呀。要说绝对的某个时刻,任务数肯定不会大于 CPU 物理个数。

所以,“绝对并发”这个概念,不管是用来描述硬件细化的层面,还是用来描述业务逻辑的层面,都是没有什么意义的。

我们只要描述并发就好了,不用有“相对”和“绝对”的概念,这样可以简化沟通,也不会出错。

那如何来描述上面的并发用户数呢?建议用TPS来承载并发这个概念

并发数是16TPS,也就是1s内整个系统处理了16个事务

在线用户数、并发用户数怎么计算

那么新问题又来了,在线用户数和并发用户数有应该如何计算?下面我们接着来看示意图。

在这里插入图片描述
如上图所示,总共有32个用户进入了系统,但是绿色的用户并没有什么动作,那么显然,在线用户是是32个,并发用户数是16个,这时的并发数就是50%。

但是在一个系统中,通常都是下面这个样子的:
在这里插入图片描述

  • 为了能hold住更多的用户,我们通常都会把一些数据放到redis这样的缓存服务器中。所以在线用户数什么算呢?如果仅从上面这种简单图来看,其实就是缓存服务器能够有多大,能hold住多少用户需要的数据。最多再加上超时路上的用户数(问题:超时路上的用户数是什么)

  • 假设一个用户进入系统之后,需要用10K内存来维护一个用户的信息,那么 10G 的内存就能 hold 住 1,048,576 个用户的数据,这就是最大在线用户数了。在实际的项目中,我们还会将超时放在一起来考虑。

在这里插入图片描述

  • 但是并发用户数不同,他们需要在系统中执行某个动作。我们要测试的重中之重,就是统计这些正在执行动作的并发用户数。

  • 当我们统计生产环境中的在线用户数时,并发用户数也是要同时统计的。这里会涉及到一个概念:并发度

要想计算并发用户和在线用户之间的关系,都需要有并发度。

做性能的人都知道,我们有时会接到一个需求,那就是一定要测试出来系统最大在线用户数是多少。这个需求怎么做呢?

在此之前,我们需要先理解压力工具中的线程或用户数到底是不是用来描述性能表现的?我们通过一个示意图来说明:

在这里插入图片描述
通过这个图,我们可以看到一个简单的计算逻辑:

  • 如果有 10000 个在线用户数,同时并发度是 1%,那显然并发用户数就是 100。
  • 如果每个线程的 20TPS(每秒能够处理20个事务),显然只需要 5 个线程就够了(5*20TPS = 100,5个线程就能应对100个并发用户数的请求)(请注意,这里说的线程指的是压力机的线程数)。
  • 这时对 Server 来说,它处理的就是 100TPS(5*20TPS=100TPS),平均响应时间是 50ms。50ms 就是根据1000ms/20TPS 得来的(请注意,这里说的平均响应时间会在一个区间内浮动,但只要TPS 不变,这个平均响应时间就不会变)。
  • 如果我们有两个 Server 线程来处理,那么一个线程就是 50TPS,这个很直接吧。
  • 请大家注意,这里有一个转换的细节,那就是并发用户数到压力机的并发线程数。这一步,我们通常怎么做呢?就是基准测试的第一步。关于这一点,我们在后续的场景中交待。

而我们通常说的并发这个词,依赖TPS来承载的时候,指的都是server端的处理能力,并不是压力工具上的并发线程数。在上面的例子中,我们说的并发就是指服务器上100TPS的处理能力。

实例

实例:JMeter(1 个线程) - Nginx - Tomcat - MySQL
在这里插入图片描述
我们可以看到,JMeter的平均响应时间基本都在5ms,因为只有一个压力机线程,所以它的TPS应该接近1000ms/5ms=200TPS。从测试结果上看,也确实是接近的。那为什么会少一点呢?因为这里算的是平均数,并且这个数据是30s刷新一次,用30s的时间内完成的事务数除以30s得到的,但是如果事务还没有完成,就不会计算在内了;同时,如果在这段时间内由一两个时间长的事务,也会拉低TPS。

那么对于服务端呢,我们来看看服务端线程的工作情况。
在这里插入图片描述

可以看到在服务端,我开了 5 个线程,但是服务端并没有一直干活,只有一个在干活的,其他的都处于空闲状态。

这是一种很合理的状态。但是你需要注意的是,这种合理的状态并不一定是对的性能状态。

  • 并发用户数(TPS)是 193.6TPS。如果并发度为 5%,在线用户数就是193.6/5%=3872。
  • 响应时间是 5ms。
  • 压力机并发线程数是 1。这一条,我们通常也不对非专业人士描述,只要性能测试工程师自己知道就可以了

下面我们换一下场景,在压力机上启动 10 个线程。结果如下:

在这里插入图片描述
平均响应时间在 25ms,我们来计算一处,(1000ms/25ms)*10=400TPS,而最新刷出来的一条是 396.2,是不是非常合理?

再回来看看服务端的线程:

在这里插入图片描述
同样是 5 个线程,现在就忙了很多。

  • 并发用户数(TPS)是 396.2TPS。如果并发度为 5%,在线用户数就是396.2/5%=7924。
  • 响应时间是 25ms。
  • 压力机并发线程数是 10。这一条,我们通常也不对非专业人士描述,只要性能测试工程师自己知道就可以了。

也就是说计算公式为:
T P S = 1000 m s 响 应 时 间 ( 单 位 m s ) ∗ 压 力 机 线 程 数 TPS= \frac{1000ms}{响应时间(单位ms)} * 压力机线程数 TPS=ms1000ms线

也就是说,对于压力工具来说,只要不报错,我们就关心TPS和响应时间就可以了,因为TPS反应出来的是和服务器对应的处理能力,至于压力线程数量是多少,并不关键。也就是说,没有必要在乎Jmeter是BIO还是AIO

那是不是可以这样理解,服务端有多少线程,就可以支持多少个压力机上的并发线程。但这取决于TPS有多少,如果服务端处理得快,那压力机的并发线程就可以更多一点。

这个逻辑看似很合理,但是通常服务端都是由业务逻辑的,既然有业务逻辑,显然不会比压力机块

应该说,服务端需要更多的线程来处理压力机线程发过来的请求。所以我们用几台压力机就可以压十几台服务端的性能了

如果在一个微服务的系统中,因为每个服务都只做一件事情,拆分的很细,我们要注意整个系统的容量水位,而不是看某一个服务的能力,这就是拉平整个系统的容量。

总结

  • 通常所说的并发都是指服务端的并发,而不是指压力机上的并发线程数,因为服务端的并发才是服务器的处理能力。
  • 性能中常说的并发,是用 TPS 这样的概念来承载具体数值的。
  • 压力工具中的线程数、响应时间和 TPS 之间是有对应关系的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

性能:你知道并发用户数应该怎么算吗 的相关文章

  • STM32 | 分享自定义协议的一些典型例子

    1024G 嵌入式资源大放送 xff01 包括但不限于C C 43 43 单片机 Linux等 关注微信公众号 嵌入式大杂烩 xff0c 回复1024 xff0c 即可免费获取 xff01 上次分享的 分享一个很酷的上位机软件 中 xff0
  • 基于TCP/IP和UDP协议的socket编程结构解析

    1 套接字 xff08 socket xff09 socket起源于Unix xff0c 而Unix Linux基本哲学之一就是 一切皆文件 xff0c 都可以用 打开open gt 读写write read gt 关闭close 模式来操
  • printf 函数实现的深入剖析[转载]

    研究printf的实现 xff0c 首先来看看printf函数的函数体 xff01 int printf const char fmt int i char buf 256 va list arg 61 va list char amp f
  • Altium Designer(AD20)画PCB时ctrl键、shift键、鼠标按键的妙用

    ctrl键的妙用 1 绘画窗口放大缩小 按住ctrl键 43 滚动鼠标滚轮 xff0c 滚前放大 xff0c 滚后缩小 2 高亮 按住ctrl键 43 鼠标点击有网络信号的焊盘 过孔 线 xff0c 便高亮该网络 xff0c 其他网络变暗或
  • PyQt结合Opencv显示图片以及摄像头

    环境 xff1a python3 7 PyQt5 11 3 OpenCV python4 0 0 21 Pycharm 2018 2 2 1 通过PyQt与OpenCV显示图片 import sys import cv2 import nu
  • allegro更新铜皮方法和快捷键

    前景 xff1a 在如今时代 xff0c allegro软件是三大PCB设计软件之一 xff0c 不少知名公司都要求会allegro软件 xff0c 所以很多PCBlayout工程师开始转用allegro xff0c 同时也出现很多新手学a
  • Allegro快捷键(env)位置和快捷键设置

    前景 在画PCB板 xff0c 保证质量同时 xff0c 也要讲究效率 xff0c 要是一只手用鼠标来点选命令画板 xff0c 效率会大大折扣 xff0c 所以出现PCBlayout快捷键 xff0c 本文章将的是allegro快捷键 al
  • Altium Designer使用者,你想要一键出Gerber吗?

    前言 在我们辛辛苦苦画完一个PCB板 xff0c 细心谨慎地生成Gerber xff0c 突然 xff0c 发现一个丝印没摆好 xff0c 只能改丝印再重新生成Gerber xff0c 又突然 xff0c 发现有根线离电源太近了 xff0c
  • allegro同比例放大缩小LOGO丝印

    前言 在遇到元件密集情况下 xff0c 既要兼顾元件位号丝印 xff0c 又能凸显公司的LOGO时 xff0c 常常碰到LOGO丝印太大 xff0c 放不下 xff0c 要是再缩小一点 xff0c 就能放下了 所以我就写了这篇文章 xff0
  • 利用Sigrity的SPEED2000进行时域电源噪声分析

    前序 相信大家在网上可以找到本文章的类似教程 xff0c 我就是这样 xff0c 找到了教程 xff0c 兴致冲冲地按教程每个步骤操作 xff0c 但最后因为素材不一样 xff0c 得不到想要的结果 xff0c 有时出来的波形是一条水平线
  • 利用Sigrity PowerDC进行单板直流仿真--静态功率传输体系分析

    前序 本文章利用Sigrity PowerDC进行单板直流仿真 静态功率传输体系分析的教程写出来 xff0c 同时 xff0c 将Sigrity PowerDC 单板直流仿真分析素材上传 xff0c 供大家使用 xff0c 不用苦苦寻找仿真
  • org.htmlparser小结

    org htmlparser 主要用来解析HTML网页 一 基本上HTML中的每个标签对应于一个类 xff0c 例如 xff1a p标签对应于ParagraphTag类 ul标签对应于BulletList类 li标签对应于Bullet类 a
  • STM32中使用printf打印串口数据

    STM32使用printf打印串口 摘要 该方法适用于 STM32 xff0c 实现了使用 printf 等标准 C 流函数输出数据的办法 xff0c 极大的减少了输出串口数据时所需要做的数据处理 实现原理 在 C 库中 xff0c pri
  • 尺取法(图文解析、初学推荐)

    文章目录 最少连续页 xff08 poj3320 xff09 分析题意第一步 xff1a 找第一个满足条件区间第二步 xff1a 开始将左端边界向右移 xff0c 达到 缩小 区间 减少连续页的目的 归纳总结代码 尺取法 xff1a 顾名思
  • 第九届蓝桥杯——倍数问题(数论、枚举)

    倍数问题 众所周知 xff0c 小葱同学擅长计算 xff0c 尤其擅长计算一个数是否是另外一个数的倍数 但小葱 只擅长两个数的情况 xff0c 当有很多个数之后就会比较苦恼 现在小葱给了你 n 个数 xff0c 希望你 从这 n 个数中找到
  • 基于Python OpenCV的车牌识别(一)————车牌定位

    一开始本想基于OpenCV原理编写定位程序的 xff0c 但发现效果并不是特别理想 xff0c 只能识别我处理的那张图片的车牌 xff0c 在使用其他图片识别的时候失误非常多 xff0c 几乎识别不到车牌 xff0c 下面附上识别的代码和效
  • 计算机网络——尝试SMTP交互(邮件发送)

    前言 本文通过 Windows 命令提示符 xff08 cmd xff09 实现邮件发送 第一步 xff1a 打开 Windows Telnet Client 功能 打开控制面板 点击程序 点击启动或关闭 Windows 功能 将 Teln
  • 离散数学:推理规则

    推理规则解释说明前提引入规则可以在证明的任何时候引入前提结论引入规则在证明的任何时候 xff0c 已证明的结论都可以作为后续证明的前提置换规则在证明的任何时候 xff0c 命题公式中的任何子命题公式都可以用与之等价的命题公式置换假言推理规则
  • 离散数学:谓词逻辑命题符号化

    个体词 个体常项或个体常元 xff1a 使用 x y z 表示个体变项或个体变元 xff1a 使用 a b c 表示个体域或论域 xff1a 个体变元的取值全总个体域 xff1a 宇宙件一切事物 谓词 概念 xff1a 表示个体性质或彼此之

随机推荐

  • 离散数学:主范式(主析取范式、主合取范式)

    求解主析取范式 主合取范式方法 1 真值表法 在表中列出变元值的全部可能 查表判断命题 命题结果真 xff0c 变元值对应主析取范式 命题结果假 xff0c 变元值对应主合取范式 2 等值演算法 命题化简 蕴涵等值式 xff1a A B A
  • Camera:双摄基本原理

    基本概念 基线 xff1a 两镜头的间距 景深 xff1a 画面清晰范围 xff0c 景深小 浅 背景虚化 xff0c 景深大背景清晰 影响景深的三个因素 xff1a 光圈 xff08 反比 xff0c 光圈越大景深越小 xff09 焦距
  • Linux:Hello World 模块

    前言 Linux 系统为应用程序提供了功能强大且容易扩展的 API xff0c 但在某些情况下 xff0c 这还远远不够 与硬件交互或进行需要访问系统中特权信息的操作时 xff0c 就需要一个内核模块 下面从 Hello World 模块来
  • 基础算法题 —— 计算字符串的编辑距离(动态规划)

    题解 在题目所求的编辑距离是指字符串 a 转换成字符串 b 所需最小的操作步骤 a i 61 b j 时 xff0c 要使 a i 61 61 b j 可使用的操作步骤如下 xff1a a i 可替换成 b j 字符串 a 下标为 i 的位
  • Matlab —— 02 基本操作与矩阵输入

    一 基本操作 1 help 功能 xff1a 便于快速了解指令的使用 ex 查询 pi 的简明介绍 Question 通过 matlab 计算出下列算式结果 Answer 1 2 或 xff08 3 xff09 xff08 4 xff09
  • Matlab —— 03结构化程式与自定义函数

    Script writing 新建脚本编辑界面 编辑测试文档 运行节 将整个框架划分为多个小节运行 xff0c 便于进行 Debug 设置断点 检查变量数值 方法一 xff1a 工作区内检查 方法二 xff1a 鼠标滑到变量位置 Struc
  • [unity] NavMesh 寻路 贴边走的问题 优化。

    NavMesh 寻路出来后 xff0c 角色走路很多时候贴着地图的边缘走 xff0c 很别扭 网上找了一个类似的问题 xff1a http www manew com thread 94163 1 1 html 里面方案 也挺适合我们的情况
  • 网易云ncm文件转mp3

    本人卖了一个ipod nano6 xff0c 帮买家导些歌 xff0c 结果用网易云下下来一堆ncm文件 xff0c 一脸懵逼 xff0c 因为ipod只能放mp3文件 上网查了一下ncm文件 xff0c 只能在会员有效期内放这个歌 于是上
  • catkin_make编译时fatal error: ###_msgs/***.h: 没有那个文件或目录

    h是头文件 xff0c 头文件 xff0c 就是一些定义和声明 xff0c 注意是定义 xff08 算是API接口吧 xff09 xff0c 编译时先加载这些头文件 xff0c 加载好了后主程序才能调用这些定义 那出现这种错误就是编译该程序
  • Theta* : 基于网格的任意角度寻路

    原文地址 xff08 科学上网 xff09 xff1a https arxiv org ftp arxiv papers 1401 1401 3843 pdf 1 简介 在本文中 xff0c 我们将研究一种机器人技术或视频游戏中使用的路径规
  • deepsort之YOLO系列目标跟踪及其他功能

    文章目录 一 ID switch是什么 xff1f 二 deepsort框架二 deepsort需要的模型1 目标检测器2 目标跟踪器 一 ID switch是什么 xff1f 跟踪问题中最重要的就是数据关联 xff08 data asso
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • cmake:生成动态链接库并使用

    已知 库函数的源文件名字叫hello c xff0c 库函数的头文件名字叫hello h xff0c 生成的动态链接库函数的名称叫libhello so xff0c 目标是在 hello install文件夹下安装这个库 xff0c 以便后
  • 算法:皇后问题

    问题 国际象棋中的皇后 xff0c 可以横向 纵向 斜向移动 如何在一个NXN的棋盘上放置N个皇后 xff0c 使得任意两个皇后都不在同一条横线 竖线 斜线方向上 xff1f 举个栗子 xff0c 下图的绿色格子是一个皇后在棋盘上的 封锁范
  • OpenCV+Python二维码条形码识别

    先上源码 xff0c github地址 xff1a https github com DerrickRose25 Opencv QRcode recognition 环境 xff1a Pycharm Python3 7 在pycharm里安
  • Onvif协议:实现Probe命令来进行设备发现(discover)

    在onvif协议对接中 xff0c 首先要明确服务器和客户端的身份 服务器 xff1a 通常是你要对接的其他厂家的数字摄像头 xff08 IPC xff09 客户端 xff1a 通常是对接的ipc的设备程序 xff0c 安防业内多称 xff
  • Linux C/C++编程:Udp组播(多播)

    Udp多播简介 概叙 单播用于两个主机之间单对单的通信广播用于一个主机对整个局域网上所有主机上的数据通信单播和广播是两个极端 xff0c 要么对一个主机进行通信 xff0c 要么对整个局域网的主机进行通信实际情况下 xff0c 经常需要对一
  • cmake:同一目录下多个源文件

    此文为 xff1a 轻松入门cmake系列教程前文为 xff1a cmake xff1a Hello cmake 接下来进入稍微复杂的例子 xff1a 在同一个目录下有多个源文件 第一个实验 实践 在之前的目录下添加2个文件 xff0c t
  • cmake:string

    字符串操作 概要 Search span class token operator and span Replace span class token function string span span class token punctu
  • 性能:你知道并发用户数应该怎么算吗

    我们知道 xff0c 一个性能测试中 xff0c 往往会有各种各样的指标 xff0c 比如TPS RPS QPS HPS CPM等 我们在实际工作的时候 xff0c 应该对这些概念有统一的认识 建议使用TPS作为关键的性能指标 另外 xff