吞吐量(TPS)、QPS、并发数、响应时间(RT)概念

https://blog.csdn.net/JGMa_TiMo/article/details/118481054

响应时间(RT)
响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,在讨论一个系统的响应时间时,人们通常是指该系统所有功能的平均时间或者所有功能的最大响应时间。当然,往往也需要对每个或每组功能讨论其平均响应时间和最大响应时间。
  对于单机的没有并发操作的应用系统而言,人们普遍认为响应时间是一个合理且准确的性能指标。需要指出的是,响应时间的绝对值并不能直接反映软件的性能的高低,软件性能的高低实际上取决于用户对该响应时间的接受程度。对于一个游戏软件来说,响应时间小于100毫秒应该是不错的,响应时间在1秒左右可能属于勉强可以接受,如果响应时间达到3秒就完全难以接受了。而对于编译系统来说,完整编译一个较大规模软件的源代码可能需要几十分钟甚至更长时间,但这些响应时间对于用户来说都是可以接受的。
吞吐量(Throughput)
吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。前面已经说过,对于单用户的系统,响应时间(或者系统响应时间和应用延迟时间)可以很好地度量系统的性能,但对于并发系统,通常需要用吞吐量作为性能指标。
  对于一个多用户的系统,如果只有一个用户使用时系统的平均响应时间是t,当有你n个用户使用时,每个用户看到的响应时间通常并不是n×t,而往往比n×t小很多(当然,在某些特殊情况下也可能比n×t大,甚至大很多)。这是因为处理每个请求需要用到很多资源,由于每个请求的处理过程中有许多不走难以并发执行,这导致在具体的一个时间点,所占资源往往并不多。也就是说在处理单个请求时,在每个时间点都可能有许多资源被闲置,当处理多个请求时,如果资源配置合理,每个用户看到的平均响应时间并不随用户数的增加而线性增加。实际上,不同系统的平均响应时间随用户数增加而增长的速度也不大相同,这也是采用吞吐量来度量并发系统的性能的主要原因。一般而言,吞吐量是一个比较通用的指标,两个具有不同用户数和用户使用模式的系统,如果其最大吞吐量基本一致,则可以判断两个系统的处理能力基本一致。
并发用户数
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。实际上,并发用户数是一个非常不准确的指标,因为用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求。一网站系统为例,假设用户只有注册后才能使用,但注册用户并不是每时每刻都在使用该网站,因此具体一个时刻只有部分注册用户同时在线,在线用户就在浏览网站时会花很多时间阅读网站上的信息,因而具体一个时刻只有部分在线用户同时向系统发出请求。这样,对于网站系统我们会有三个关于用户数的统计数字:注册用户数、在线用户数和同时发请求用户数。由于注册用户可能长时间不登陆网站,使用注册用户数作为性能指标会造成很大的误差。而在线用户数和同事发请求用户数都可以作为性能指标。相比而言,以在线用户作为性能指标更直观些,而以同时发请求用户数作为性能指标更准确些。
QPS每秒查询率(Query Per Second)
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。 (看来是类似于TPS,只是应用于特定场景的吞吐量)
关键指标:响应时间、QPS(每秒查询数)、TPS(每秒处理的事务数)、成功率。根据不同的业务场景,平衡各个指标之间的关系。
响应时间:
当用户在2秒内得到响应,会感觉系统的响应很快;
当用户在2~5秒内得到响应,会感觉系统的响应速度很慢,可以接受;
当用户超过8秒仍不能得到响应,会感觉系统很糟糕,此时会选择离开站点或者发起二次请求。
有同学可能会问:例如200QPS能支持多少用户访问;大概是以下公式推算:
500万人大概200qps。
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。

SLA:服务登记协议,服务提供者对服务消费者的正式承诺,是衡量服务能力等级的关键项。

TPS:每秒处理的事务数,从客户端发起请求开始计时,等收到服务器端响应结果后结束计时,在计算这个时间段内总共完成的事务个数。一个事务指的是客户端发起一个请求,并且等到请求返回之后的整个过程。
QPS:每秒的查询请求数,表示服务器端每秒能够响应的查询次数。一个TPS中可能会包括多个QPS。
RT:响应时间,表示客户端发出请求到服务端返回的时间间隔,一般表示平均响应时间。
并发数:指的是系统同时能处理的请求数量。如果QPS=1000,表示每秒钟客户端会发起1000个请求到服务端,而如果一个请求的处理耗时是3s,那么意味着总的并发=1000*3=3000,也就是服务端会同时有3000个并发。

指标的计算:
假设在一个小时内,有200W用户访问系统,平均每个用户请求的耗时是3秒。
QPS=2000000/(6060)=556
并发数=5563=1668
随着RT的值越大,并发数越多,意味着服务端占用的连接数越多,会消耗内存资源和CPU资源等。在实际业务中,RT的值越小越好,应该缩小RT的值。

2/8法则推算1000W用户的访问量:
1000w用户,每天访问的用户占20%,也就是每天有200w用户来访问。假设平均每个用户过来点击5次,总共的pv=1亿。一天24小时,根据2/8法则,每天8000w(80%)用户活跃的时间点集中在(24*0.2)5小时内。此时的 QPS = 4500(8000w/5小时,平均每秒查询数)。在这5个小时中请求并非非常平均,可能会存在大量的用户集中访问,因此一般情况下访问峰值是平均访问请求的3~4倍左右,此时的QPS大约QPS=18000。

服务器压力估计:
TCP连接对于系统资源最大的开销就是内存。
因为tcp连接归根结底需要双方接收和发送数据,那么就需要一个读缓冲区和写缓冲区,这两个buffer在linux下最小为4096字节,可通过cat /proc/sys/net/ipv4/tcp_rmem和cat /proc/sys/net/ipv4/tcp_wmem来查看。
所以,一个tcp连接最小占用内存为4096+4096 = 8k,那么对于一个8G内存的机器,在不考虑其他限制下,最多支持的并发量为:810241024/8 约等于100万。此数字为纯理论上限数值,在实际中,由于linux kernel对一些资源的限制,加上程序的业务处理,所以,8G内存是很难达到100万连接的,当然,我们也可以通过增加内存的方式增加并发量。

如何降低RT的值?
请求执行过程中会做的事情:查询数据库、访问磁盘数据、进行内存运算、调用远程服务。
每一步操作都会消耗一定量的时间,当前客户端的请求只有等到这些操作都完成之后才能返回,因此降低RT可以通过优化业务处理逻辑。

1 数据库优化
当18000个请求进入到服务端并且被接收后,开始执行业务逻辑处理,那么必然会查询数据库。每个请求至少都有一次查询数据库的操作,多的需要查询3~5次以上,我们假设按照3次来计算,那么每秒会对数据库形成54000个请求,假设一台数据库服务器每秒支撑10000个请求(影响数据库的请求数量有很多因素,比如数据库表的数据量、数据库服务器本身的系统性能、查询语句的复杂度),那么需要6台数据库服务器才能支撑每秒10000个请求。
如果数据库服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
数据表数据量过大,比如达到几千万甚至上亿,这种情况下sql的优化已经毫无意义了,因为这么大的数据量查询必然会涉及到运算。
可以缓存来解决读请求并发过高的问题,一般来说对于数据库的读写请求也都遵循2/8法则,在每秒54000个请求中,大概有43200左右是读请求,这些读请求中基本上90%都是可以通过缓存来解决。
分库分表,减少单表数据量,单表数据量少了,那么查询性能就自然得到了有效的提升•读写分离,避免事务操作对查询操作带来的性能影响。
写操作本身耗费资源数据库写操作为IO写入,写入过程中通常会涉及唯一性校验、建索引、索引排序等操作,对资源消耗比较大。一次写操作的响应时间往往是读操作的几倍甚至几十倍。
锁争用写操作很多时候需要加锁,包括表级锁、行级锁等,这类锁都是排他锁,一个会话占据排它锁之后,其他会话是不能读取数据的,这会会极大影响数据读取性能。所以MYSQL部署往往会采用读写分离方式,主库用来写入数据及部分时效性要求很高的读操作,从库用来承接大部分读操作,这样数据库整体性能能够得到大幅提升。
为什么数据放入redis缓存中能提升性能?
(1)redis存储的是k-v数据,时间复杂度是0(1),MySQL存储引擎的底层实现是B+树,时间复杂度是O(logn)。
(2)Mysql数据存储是存储在表中,查找数据时要先对表进行全局扫描或根据索引查找,这涉及到磁盘IO,磁盘查找如果是单点查找可能会快点,但是顺序查找就比较慢。而redis不用这么麻烦,本身就是存储在内存中,会根据数据在内存的位置直接取出。
(3)Redis是单线程的多路复用IO,单线程避免了线程上下文切换的开销,而多路复用IO避免了IO等待的开销,在多核处理器下提高处理器的使用效率可以对数据进行分区,然后每个处理器处理不同的数据。
2 磁盘数据访问优化
对磁盘的访问主要是读和写操作,优化方案如下:
(1)磁盘的页缓存,借助缓存IO,充分利用系统缓存,降低实际IO的次数。
(2)顺序读写,可以用追加写代替随机写,减少寻址开销,加快IO写的速度。
(3)SSD代替HDD,固态硬盘的IO效率远远高于机械硬盘。
(4)在需要频繁读写同一块磁盘空间时,可以用mmap(内存映射)代替读写,减少内存的拷贝次数。
(5)在需要同步写的场景下,尽量将写请求合并,而不是让每个请求都同步写入磁盘,可以用fsync。

3 合理利用内存
充分利用内存缓存,把一些经常访问的数据和对象保存在内存中,这样可以避免重复加载或者避免数据库访问带来的性能损耗。比如利用redis缓存热点数据。

4 调用远程服务
远程服务调用的影响IO性能因素:
远程调用等待返回结果的阻塞、异步通信、网络通信的耗时、内网通信、增加网络带宽、远程服务通信的稳定性。

5 异步化架构
微服务中的逻辑复杂处理时间长的情况,在高并发下,导致服务线程消耗尽,不能创建线程处理请求。可以考虑在架构上做调整,先返回结果给客户端,让用户可以继续使用客户端的其他操作,再把服务端的复杂逻辑处理模块做异步化处理。异步化处理适用于客户端对处理结果不敏感不要求实时的情况,比如群发邮件、群发消息等。
————————————————
版权声明:本文为CSDN博主「BUG记录机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JGMa_TiMo/article/details/118481054

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

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

相关文章

净利降4成、股价腰斩,戎美困在“淘系女装第一股”

今年的“双11”静悄悄。 作为“淘系女装第一股”,戎美却拒绝参加“双11”。 戎美作为一家淘宝女装店,喊出“从不打折,从不参加任何促销”的口号;尽管戎美采取独特的营销策略,但其业绩承压困局也写在最新的三季报里。…

基于SpringBoot+Redis实现查找附近用户的功能

前言 简单记录一下使用Redis的GEO命令,SpringDataRedis提供了十分简单的地理位置定位的功能,实现查找附近用户的功能。 一、Redis的GEO命令之GEOADD、GEORADIUS命令 1.GEOADD 命令 (1)用法:GEOADD key [longitude]…

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏3(附项目源码)

文章目录 先本文看看最终效果前言二叉空间分割算法房间优先生成使用走廊连接各个房间BSP和随机游走源码完结 先本文看看最终效果 前言 前两期我们使用了随机游走算法已经实现了地牢的生成,本期再说另外一种生成地牢的方法,使用二叉空间分割算法&#xf…

【机器学习】039_合理初始化

一、稳定训练 目标:使梯度值在更合理的范围内 常见方法如下: 将乘法变为加法 ResNet:当层数较多时,会加入一些加法进去 LSTM:如果时序序列较长时,把一些对时序的乘法做加法 归一化 梯度归一化&…

【面试HOT300】滑动窗口篇

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于【CodeTopHot300】进行的,每个知识点的修正和深入主要参…

01【SpringBoot快速入门、yml语法、自动配置、整合框架】

目录 一、SpringBoot简介 1.1 Spring优缺点 1.1.1 Spring的优点 1.1.2 Spring的缺点 1.2 SpringBoot的概述 1.2.1 SpringBoot概述 1.2.2 SpringBoot的核心功能 二、SpringBoot快速入门 2.1 创建Maven工程 2.2 添加起步依赖 2.3 编写Controller 2.4 编写SpringBoot引…

易点易动设备管理系统:提升企业设备保养效率的最佳选择

在现代企业中,设备的正常运行和保养对于业务的顺利进行至关重要。然而,传统的手动设备管理方式往往效率低下、容易出错,给企业带来不必要的成本和风险。为了解决这一问题,易点易动设备管理系统应运而生。本文将介绍易点易动设备管…

No such module ‘FacebookCore‘

在下面的地方添加这个库

Java的深拷贝和浅拷贝思考

前言 在Java面试中,深拷贝和浅拷贝的概念是经常被问到的。虽然已经看过一些相关的文章,但我觉得它们并没有讲得很清楚。我希望通过这篇文章,能够更深入地理解并解释深拷贝和浅拷贝的概念,以便更好地应对面试。 一、深拷贝和浅拷…

使用jmx_exporter监控Kafka

prometheus 监控 kafka 常见的有两种开源方案,一种是传统的部署 exporter 的方式,一种是通过 jmx 配置监控,本文将采用第二种方式进行配置。 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporterjmx_exporter:https://github.com/prometheus/jmx_expo…

常用的工作资料怎么在电脑上记录呢?

在现代工作中,我们经常需要记录各种各样的工作资料,例如会议记录、项目计划、待办事项等等。传统的纸质笔记本虽然方便携带,但难以整理和检索。而在电脑上直接记录常用的工作资料,在记录、整理、查看、使用等方面都是更为高效、便…

【追求卓越07】算法--二分查找

引导 经过前面几节排序内容,我们开始接触查找算法--二分查找。 二分查找的时间复杂度是O(logn),是一个非常高效的算法。虽然理解起来很容易,但是真正想要熟练掌握就没那么简单了。 二分查找 二分查找原理: 首先,假设…

C++ MiniZip实现目录压缩与解压

Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是…

bug场景记录

项目场景&#xff1a; mapper.xml文件中sql语句执行失败&#xff0c;显示输入的参数数量不对 问题描述 <select id"page" resultType"com.sky.entity.Employee">select * from employee<where><if test"name ! null and name !"…

ABAP 长文本操作

关联表 1.STXH&#xff1a;长文本抬头表 2.STXL&#xff1a;长文本行表 3.TTXID&#xff1a;Text ID 表 4.TTXOB&#xff1a;Textobject表 5.订单中众多的文本描述&#xff0c;我们怎么知道其对应的【对象】&【ID】呢&#xff1f; 可SE38-通过查找程式&#xff1a;RST…

超详细 | 实验室linux服务器非root账号 | 安装pip | 安装conda

登录实验室公用服务器&#xff0c;个人账号下&#xff08;非root&#xff09;是空的&#xff0c;啥也没有&#xff0c;想安装下pip和conda。 转了一圈&#xff0c;好像没太有针对这个需求写具体博客的&#xff0c;但有挺多讲直接在root下安的&#xff08;用的应该是个人虚拟机&…

基于 EmotiVoice 的批量 TXT 文本转语音工具

比老版本文本转语音更好的TTS工具来了~ &#xff01;&#xff01;&#xff01;除了正常的输入文本转为语音功能之外&#xff0c;还新增了 从 txt 文本批量转为语音的功能。 &#xff01;&#xff01;&#xff01;支持超过 2000 种不同的说话者声音 &#xff01;&#xff01;…

透视未来:现代发电厂地区可视化与智慧能源的结合

随着全球能源消费的不断增长&#xff0c;电力需求也在不断上升。作为能源行业的重要组成部分&#xff0c;现代发电厂扮演着不可替代的角色。而现代发电厂的数据管理和监控系统&#xff0c;则是确保其安全、高效、稳定运行的重要手段。在这个背景下&#xff0c;现代发电厂地区可…

Missing file libarclite_iphoneos.a 问题解决方案

问题 在Xcode 运行项目会报以下错误 File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a解决方案 打开URL https://github.com/kamyarelyasi/Libarclite-Files &#xff0c;下载liba…

torchvision中的标准ResNet50网络结构

注&#xff1a;仅用以记录学习 打印出来的网络结构如下&#xff1a; from torchvision import models model models.resnet50(pretrainedFalse) print("model: ", model) 结构&#xff1a; ResNet((conv1): Conv2d(3, 64, kernel_size(7, 7), stride(2, 2), padd…