TPS、并发数与线程数,傻傻分不清楚?

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: TPS、并发数与线程数,傻傻分不清楚?

640.png

最近遇到了两个关于性能测试的场景,发现有三个很多人理不清楚的概念:TPS、并发数及线程数。这三者到底有什么关系呢?其实概念是相对简单的,但是在使用的时候,往往会有很多混淆的情况出现。

先说定义:

TPS:单位时间(每秒)处理的事务数。

并发数:同一时刻系统同时处理的请求数(相对并发,绝对并发)。

线程数:一般情况下,指是的虚拟用户数。

你看,是不是很清晰?



1

两个场景


场景一:登录接口能够承受秒级 1000 并发。

那么,这里的并发是TPS?还是并发数?还是线程数?如果是你,你会如何解读呢?说说个人的理解:一般情况下,在做性能测试时,都不会去强调并发的概念。因为现实的场景中,除了秒杀、整点开抢等几类特殊的场景外,都不会进行狭义上的并发测试。所以,这里的1000并发,应该指的是TPS为1000。

 

场景二:已知TPS是1000,如何估算出系统支持的最大在线用户数?

这个是无法通过理论知识来估算出来的。因为这两者本身就没有什么直接的关系。用户在线,并不一定产生请求,又或者这些请求也不是我们要测试的场景。所以请求那些面试官或者产品经理能否尊重下性能测试?不要再问这些没有逻辑的问题?如果真想了解如何评估系统容量,请系统的学习下相关知识,而不是拿一个TPS强人所难。



2

澄清三者关系


并发数较好说,分为强并发和弱并发。所谓的强并发指的是单位时间内,同时请求的数量。类似的场景就是秒杀活动或者整点活动这类的场景。而我们通常说的并发,指的都是一段时间内(可以是秒级,也可以是分钟级的),系统能够处理的数据总量。这更符合我们的实际场景。

 

基于上面的概念,TPS = Vu(总请求数)/Time(响应时间+思考时间),(这里暂不考虑网络传输的时间,思考时间也可以忽略吧,你们的脚本会考虑这些么?复杂问题简单化)。而Vu(总请求数)是怎么来的?

 

我们在模拟大批量的请求时,不太可能自己手动去点。所以需要借助工具来模拟。这就涉及到了线程数。通常情况下,一个线程数代表一个用户,在我们计划的执行时间或者执行次数下,向服务器发起请求。所以线程数只是我们模拟请求的概念,和实际的性能问题没有直接的关系,服务端只关心在一段时间内,处理了多少请求,并不关心这些请求是从哪里来的。如果你的负载机性能足够好,那么单位时间内,10000个请求,你可以用100个线程执行100次,也可以用1000个线程执行10次。这完全是负载机的问题,虽然达到服务端的时间会有微小的差异,但基本上可以忽略。


3

TPS与响应时间


其实,我们在描述系统的性能能力时,只说TPS是不够的。还需要考虑到响应时间和系统资源使用率,系统资源使用率在没太大瓶颈的前提下,可以不谈,但是不谈响应时间就不应该了。例如,有两个系统,TPS都是1000,但A系统的响应时间是0.5S,B系统的响应时间是2S,你觉得哪个系统的性能好?明显可以看出,A系统的TPS还有很大的提升空间嘛。就像你能考100分,是你努力的结果,而学霸考100分是因为卷面只有100分。对于A系统,应该继续往上压,找出更好的TPS,而对于B系统,差不多要进行调优了。



4

TPS中的T


一般情况下,我们在讲TPS时,都是讲单接口的TPS,也可以是QPS(每秒查询事务数)。但是在实际的工作场景中,某一个T(Transactions)都会有由若干个接口共同完成。很多性能测试工具,都提供了自定义Transactions的功能。因为这个Transactions才是描述客户行为的真实场景。所以在性能测试报告中,我们需要告诉用户你是如何定义Transactions的。不同的定义方法,TPS会有较大的差异。不能为了追求数值上的好看,而忽略了真实场景。



5

小结


理清基础的概念,有助于指导我们在真实场景下的落地实践。不要过于纠结并发数,这个指标更多的是体现负载机的性能,通过TPS 结合响应时间,才能更好地反馈系统的性能问题。同时,性能测试是个系统的专项工程,它有自己的方法论和评估体系,需要从业者更深入地了解和学习,而不是为了几个指标去做性能测试。别人可能因为不专业,所以不清楚,但我们是从业者,应该有能力去帮助产品或者客户澄清这些疑问,而不是听之任之。


6

预告

本周三(4月13号)晚上9点,我将会和老张、CC一起聊聊质量内建的话题,欢迎大家预约收看


相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
151 0
|
21天前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
127 59
|
12天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
3月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
90 0
|
1月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
26 1
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
2月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
2月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
57 0
|
2月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
3月前
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
59 0