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

性能附录:如何计算并发用户数(摘自高楼老师《性能30讲》)

高楼老师《性能30讲》: 性能测试实战30讲-极客时间 感兴趣的同学可以去读一下,个人感觉写的非常好

目录

什么是并发?

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

总结

什么是并发?

        我们假设上图中的这些小人是严格按照这个逻辑到达系统的,那显然,系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数,那就是 16。

但是,在实际的系统中,用户通常是这样分配的:

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

那么如何来描述上面的并发用户数呢?在这里我建议用 TPS 来承载“并发”这个概念。

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

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

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

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

 但在一个系统中,通常都是下面这个样子的。

        为了能 hold 住更多的用户,我们通常都会把一些数据放到 Redis 这样的缓存服务器中。所以在线用户数怎么算呢,如果仅从上面这种简单的图来看的话,其实就是缓存服务器能有多大,能 hold 住多少用户需要的数据。

最多再加上在超时路上的用户数。如下所示:

        所以我们要是想知道在线的最大的用户数是多少,对于一个设计逻辑清晰的系统来说,不用测试就可以知道,直接拿缓存的内存来算就可以了。

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

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

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

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

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

        很多人都是通过加思考时间(有的压力工具中叫等待时间,Sleep 时间)来保持用户与系统之间的 session 不断,但实际上的并发度非常非常低。

        这里有一个比较严重的理解误区,那就是压力工具中的线程或用户数到底是不是用来描述性能表现的?我们通过一个示意图来说明:

通过这个图,我们可以看到一个简单的计算逻辑:

1. 如果有 10000 个在线用户数,同时并发度是 1%,那显然并发用户数就是 100。

2. 如果每个线程的 20TPS,显然只需要 5 个线程就够了(请注意,这里说的线程指的是压力机的线程数)。

3. 这时对 Server 来说,它处理的就是 100TPS,平均响应时间是 50ms。50ms 就是根据 1000ms/20TPS 得来的(请注意,这里说的平均响应时间会在一个区间内浮动,但只要 TPS 不变,这个平均响应时间就不会变)。

4. 如果我们有两个 Server 线程来处理,那么一个线程就是 50TPS,这个很直接吧。

5. 请大家注意,这里我有一个转换的细节,那就是并发用户数到压力机的并发线程数。这一步,我们通常怎么做呢?就是基准测试的第一步。关于这一点,我们在后续的场景中交待。

        而我们通常说的“并发”这个词,依赖 TPS 来承载的时候,指的都是 Server 端的处理能力,并不是压力工具上的并发线程数。在上面的例子中,我们说的并发就是指服务器上 100TPS 的处理能力,而不是指 5 个压力机的并发线程数。所以,不要在意你用的是什么压力工具,只要在意你服务端的处理能力就可以了。

现在来看一个实例。这个例子很简单,就是:

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

那么对于服务端呢,我们来看看服务端线程的工作情况。

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

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

1. 并发用户数(TPS)是 193.6TPS。如果并发度为 5%,在线用户数就是 193.6/5%=3872。

2. 响应时间是 5ms。

3. 压力机并发线程数是 1。这一条,我们通常也不对非专业人士描述,只要性能测试工程师自己知道就可以了。

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

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

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

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

同样是 5 个线程,现在就忙了很多。

并发用户数(TPS)是 396.2TPS。如果并发度为 5%,在线用户数就是 396.2/5%=7924。响应时间是 25ms。压力机并发线程数是 10。

如果要有公式的话,这个计算公式将非常简单:

TPS=响应时间(单位ms)1000ms​∗压力机线程数

        你也许会说,这个我理解了,服务端有多少个线程,就可以支持多少个压力机上的并发线程。但是这取决于 TPS 有多少,如果服务端处理的快,那压力机的并发线程就可以更多一些。

        这个逻辑看似很合理,但是通常服务端都是有业务逻辑的,既然有业务逻辑,显然不会比压力机快。应该说,服务端需要更多的线程来处理压力机线程发过来的请求。所以我们用几台压力机就可以压几十台服务端的性能了。

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

总结

        通过示意图和示例,描述了在线用户数、并发用户数、TPS(这里我们假设了一个用户只对应一个事务)、响应时间之间的关系。有几点需要强调:

        1. 通常所说的并发都是指服务端的并发,而不是指压力机上的并发线程数,因为服务端的并发才是服务器的处理能力。

        2. 性能中常说的并发,是用 TPS 这样的概念来承载具体数值的。

        3. 压力工具中的线程数、响应时间和 TPS 之间是有对应关系的。

相关文章:

性能附录:如何计算并发用户数(摘自高楼老师《性能30讲》)

高楼老师《性能30讲》: 性能测试实战30讲-极客时间 感兴趣的同学可以去读一下,个人感觉写的非常好 目录 什么是并发? 在线用户数、并发用户数怎么计算 总结 什么是并发? 我们假设上图中的这些小人是严格按照这个逻辑到达系统的,那显然,…...

视频推拉流EasyDSS点播平台云端录像播放异常问题的排查与解决

EasyDSS视频直播点播平台是一个功能全面的系统,提供视频转码、点播、直播、视频推拉流以及H.265视频播放等一站式服务。该平台与RTMP高清摄像头配合使用,能够接收无人机设备的实时视频流,实现无人机视频推流直播和巡检等多种应用。 最近&…...

【Python系列】Python 连接 PostgreSQL 数据库并查询数据

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...

辛格迪客户案例 | 甫康(上海)健康科技有限责任公司药物警戒管理系统(PVS)项目

01 案例企业 甫康(上海)健康科技有限责任公司(简称“甫康”)该公司成立于2015年11月3日。公司的核心团队由来自中国和国外顶级制药公司的专业人士组成,与中国科学院上海药物研究所等知名研究机构保持紧密合作。此外,甫康药业还与…...

重新审视 ChatGPT 和 Elasticsearch:第 2 部分 - UI 保持不变

作者:来自 Elastic Jeff Vestal 本博客在第 1 部分的基础上进行了扩展,介绍了基于 RAG 的搜索系统的功能齐全的 Web UI。最后,你将拥有一个将检索、搜索和生成过程结合在一起的工作界面,同时使事情易于调整和探索。 不想读完整个内…...

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear(切变)Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标(Homogenous Coordinates)3D transformationScale&TranslationRotation Viewing / Camera t…...

基于反激电路的电池充放电均衡控制

基于反激电路的电池充放电均衡控制是一种高效的能量转移型主动均衡方法,适用于锂离子电池组等串联电池组的管理。以下从原理、拓扑结构、控制策略和设计要点进行详细分析: 一、基本原理 反激电路(Flyback Converter)是一种隔离型…...

Windows版FFmpeg使用及B站视频下载示例python源码

Windows版FFmpeg使用及B站视频下载示例python源码 FFmpeg介绍和下载 FFmpeg 是一个功能强大、灵活且广泛使用的多媒体处理工具,无论是在专业领域还是日常使用中,都能满足各种多媒体处理需求。FFmpeg 是一个开源项目,遵循 LGPL 或 GPL 许可。…...

leetcode_动态规划/递归 509. 斐波那契数

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1F(n) F(n - 1) F(n - 2),其中 n …...

对泰坦尼克号沉没事件幸存者数据分析和预测

一、分析目的 探究决定泰坦尼克号沉没事件中什么因素决定着船上人的生死,并对实例进行判别和预测。 二、数据介绍 Titanic.csv数据中包含了891个样本,记录了泰坦尼克号遇难时的891个乘客的基本信息,其中包括以下信息: Passenger…...

算法之排序算法

排序算法 ♥常见排序算法知识体系详解♥ | Java 全栈知识体系 算法 - 排序 | CS-Notes 面试笔记 十大经典排序算法总结 | JavaGuide...

DMA发送全部历史记录数据到串口

背景 博主参与的项目中,有个读取全部历史记录的功能,如果下位机在主程序中将全部历史记录单纯地通过串口传输会比较占用cpu资源,影响主程序中别的功能。最后商量得出以下实现方案: 定义两个发送缓冲区DMATxbuf1和DMATxbuf2&…...

蓝桥杯好题推荐-----高精度减法

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 记录详情 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/record/205122671 思路讲解 这个题目的解题思路,其实是和高精度加法是非常像的。怎么说…...

SpringMVC (3)

目录 1. 传递对象 2. 后端参数重命名(后端参数映射) 3. 传递数组 4. 传递集合 5. 传递JSON数据 5.1 JSON概念 5.2 JSON语法 5.3 JSON字符串和Java对象互转 5.4 JSON优点 5.5 传递JSON对象 6. 获取URL中参数PathVariable 7. 上传文件RequestP…...

vscode使用豆包MARSCode----集成doubao1.5 DeepSeekR1 DeepseekV3模型的ai编程插件

引入扩展 打开VSCode扩展窗口,在搜索窗口搜索MarsCode,找到MarsCode 插件单击「install」,完成安装,登录即可使用MarsCode 编程助手。 主要功能 主要快捷键 / explain 解释项目代码,AI 返回的内容有结构分类&#…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_buf_t

ngx_buf_t 定义在 src/core/ngx_buf.h typedef struct ngx_buf_s ngx_buf_t;struct ngx_buf_s {u_char *pos;u_char *last;off_t file_pos;off_t file_last;u_char *start; /* start of buffer */u_char …...

分布式开源协调服务之zookeeper

Zookeeper简介 Zookeeper是什么? Zookeeper官网中对Zookeeper的定义还是比较明确的: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services…...

ubuntu系统安装playhouse三方库

ubuntu系统python3.10安装playhouse三方库 问题描述 问题描述 虚拟环境中使用pip install playhouse,返回安装成功 用pip list查看,能看到playhouse及版本号 导包时提示没有找到playhouse我那件目录,能发现 检查site-package发现问题&#x…...

【星云 Orbit-F4 开发板】04.一触即发:GPIO 外部中断

【星云 Orbit-F4 开发板】04. 一触即发:外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源,并在中断回调函数中处理按键事件,实现了按键控制LED状态翻转的功能。本文旨在…...

笔记二:整数和浮点数在内存中存储

目录 一、数据类型介绍 二、类型的基本归类 1.整形家族: 2.浮点数家族: 3.构造类型: 4.指针类型 5.空类型: 三、整形在内存中的存储 3.1 原码,反码、补码 3.2 大小端介绍 四、浮点数在内存中的存储 ​编辑 4.…...

【开源】从设计文档到可交付技术交底书:专利.Skill

【开源】从设计文档到可交付技术交底书:专利.Skill 摘要 设计文档、代码都有了,专利点却还没梳清?交底书既要系统框图与流程图,又要代理人能直接改的 Word,多轮补材料还不能覆盖旧稿?本文介绍开源仓库 pat…...

从UWB定位到分布式控制:一个智能跟随行李箱的完整系统架构解析

1. 智能跟随行李箱的技术演进与市场需求 记得我第一次在机场看到智能跟随行李箱时,那种科技感十足的自动跟随场景让我印象深刻。这种能够解放双手的旅行伴侣,正在悄然改变着人们的出行方式。从技术角度看,现代智能行李箱已经实现了从简单的机…...

同事离职,他在大群里发了一句“感谢一路相伴,江湖再见”,刚发出去,HR就让他撤回,理由是工作群不要发与工作无关的内容。

今天摸鱼的时候,听到一个极其荒诞又极其现实的职场鬼故事。隔壁部门的老李提了离职,今天是last day。这哥们儿可能平时武侠小说看多了,临走前在几百人的公司大群里发了一句:“感谢一路相伴,江湖再见”。结果呢&#xf…...

基于CBLOF算法的用电异常用户识别:原理、实践与工程落地(上篇)

目录 摘要 关键词 一、引言:用电异常检测的业务痛点与技术挑战 1.1 传统阈值法的局限性 1.2 有监督学习方法的适配性不足 1.3 传统离群检测算法的不足 1.4 CBLOF算法的适配性优势 二、CBLOF算法核心原理深度剖析 2.1 算法核心流程(完整版) 步骤1:数据预处理 步骤…...

AUTOSAR兼容性验证失败?车载C#中控系统代码合规性自查清单,含ISO 26262 ASIL-B级代码审计模板

第一章:AUTOSAR兼容性验证失败的根因诊断与应对策略AUTOSAR兼容性验证失败往往并非单一模块缺陷所致,而是由配置不一致、接口语义偏差、RTE生成逻辑冲突及基础软件(BSW)版本错配等多维度因素交织引发。快速定位根本原因需构建分层…...

InfinitePCA9685:嵌入式多PCA9685芯片PWM统一控制库

1. InfinitePCA9685库概述:面向嵌入式多设备PWM控制的工程化抽象InfinitePCA9685是一个专为Arduino平台设计的轻量级C库,其核心目标是解决嵌入式系统中多PCA9685芯片协同控制这一典型工程痛点。在机器人关节驱动、LED矩阵调光、工业IO扩展等实际场景中&a…...

IC Hack Badge嵌入式驱动开发:LED扫描与FreeRTOS多任务实战

1. IC Hack Badge 嵌入式驱动开发深度解析 IC Hack Badge 是为 2025 年 IC Hack 硬件黑客马拉松定制的开源 PCB 电子徽章,其核心价值不仅在于物理形态的趣味性,更在于其作为嵌入式底层开发教学与实战平台的工程意义。该徽章采用主流低成本 MCU 架构&…...

用好AI的五个习惯

五个习惯一、善于拆解问题核心逻辑:AI是执行者,人是设计者。对项目的全流程和细节了如指掌,能够将复杂的大问题拆解为具体的、AI可执行的子任务。二、上下文管理大师核心逻辑:理解模型极限,追求高效输出。当前AI模型&a…...

.NET 9边缘测试黄金标准(微软内部CI/CD流水线首次公开):含12项必验指标与3种硬件故障注入模板

第一章:.NET 9边缘部署测试的演进与战略定位.NET 9标志着微软在云边协同架构上的关键跃迁——其原生支持AOT编译、精简运行时(Microsoft.NETCore.App.Runtime.Minimal)及轻量级容器镜像,为边缘场景下的确定性启动、低内存占用与快…...

游戏模组框架:SMAPI构建个性化星露谷体验的全栈解决方案

游戏模组框架:SMAPI构建个性化星露谷体验的全栈解决方案 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 1 技术架构解析:SMAPI如何重塑游戏扩展能力 在独立游戏模组生态中&a…...