[ES三周年]如何计算数据库的TPS和QPS
腾讯云 2023-03-20 14:07:48

介绍

我们在做数据库性能压力测试、做监控和告警项,或者想要真实地了解业务数据库负载的时候,常常需要使用两个数字化的衡量指标。他们是什么?相信很多数据库从业的读者已经呼之欲出了,那就是 QPS 和 TPS。

我们经常使用到这两个指标,那我们是否清楚他们是什么,在 MySQL 中应该如何计算获得呢?今天这里就是刨根问底栏目组...


(资料图片)

QPS的定义和计算方法

首先我们来确认一下什么是 QPS。

根据百度百科,QPS 即 Queries-per-second,是每秒查询率的意思。这个定义是非常明确的。

下面我们探讨一下,他在 MySQL 里是如何计算的。

我们先去官网查询下是否有官方的说明~

很遗憾,MySQL 官网并没有对 QPS 做出明确的解释,那么就由我来带大家一起探讨一下这个 QPS 应该怎么计算吧。经过我的研究,网上普遍存在三种 QPS 的计算方法。

QPS = DQL(select)-per-secondQPS = Queries-per-secondQPS = Questions-per-second

大家看到这三个方法可能已经懵逼了,请大家稍安勿躁,我来详细讲解一下。

方法一、QPS = DQL(select)-per-second

使用这个计算方法的人,普遍认为 QPS 的 Query,中文意思是查询的意思,所以对应的就是所有 DQL 语句,即 select 打头的语句。这种计算方式算出来的 QPS 意味着是数据库服务器的只读压力,如果数据库没有读只有写,那么他的 QPS 即为 0,这显然是不合理的,相信只有极少数人采用了这种计算方法。

方法二、Queries-per-second

方法一的计算方法是有问题的,原因在于把 QPS 中的 Q ,即 Query 理解为"查询",并偏执地理解为 DQL了,理解为 select only了,这是一种对 Q 的狭义的理解。而实际上这里的 Q 是广义的,大家想想什么是 SQL?SQL = DQL + DML + DDL + DCL,所以 QPS 中的 Q 应该和 SQL 中的 Q 一样,都是广义上的 Query,也就是所有的 SQL 语句。 那么我们如何获取 MySQL 数据库服务器上所有的 SQL 语句总数?

我们知道,从show global status like "Queries"能获取 Queries 数,官方对这个 status 值的解释是:

QueriesThe number of statements executed by the server. This variable includes statements executed within stored programs, unlike the Questionsvariable. It does not count COM_PINGor COM_STATISTICScommands.

中文的意思是,Queries 计数表示服务器执行的语句数。与 Questions 计数不同,此变量包括了存储过程中执行的语句。它不计数COM_PINGCOM_STATISTICS命令。

所以方法二的计算方法就是,从show global status like "Queries"能获取 Queries 数,然后经过 t 秒,再从show global status like "Queries"能获取 Queries 数,前后 Queries 数的差值,除以 t 秒,即算出 Queries-per-second。

看起来这种计算方式是正确的。

先别那么快下定论,咱们再看看第三种计算方法。

方法三、Questions-per-second

方法三的计算方法和方法二类似,只是把show global status like "Queries"修改为从show global status like "Questions"

那么 Questions 代表什么呢?以下是官方文档的解释:

QuestionsThe number of statements executed by the server. This includes only statements sent to the server by clients and not statements executed within stored programs, unlike the Queries variable. This variable does not count COM_PING, COM_STATISTICS, COM_STMT_PREPARE,COM_STMT_CLOSE, orCOM_STMT_RESETcommands

这里我们可以看出,Queries 计数和 Questions 计数的区别在

Queries 计数

Questions 计数

备注

因为 Queries 计数统计的更多,所以理论上 Queries 计数总是大于等于 Questions 计数。

采用 Queries 计数还是 Questions 计数,基本是见人见智了。而我们这边由于几乎没有业务使用到存储过程和预准备语句,所以用哪一种方式都一样。

有趣的现象是,官方用的是第二种方法"Queries-per-second"。纳尼?不是说官方文档没定义和说明吗? emem,这是我的发现,见下图。

截图是登录 mysql 客户端后输入\s(status)的结果,经过我的验证,这里的 Queris per second avg,等于 Questions/Uptime 而不是 Queries/Uptime。

当然这里显示的 Queris per second avg 参考意义不大,因为分母是 Uptime,也就是 mysqld 服务启动的时间。不能真实的反馈真实的、瞬时的 QPS 指标。还是老老实实用方法二提到的计算思路,获取 t 秒 Questions 的变化值,然后除以 t 秒这种方法来计算吧。

稍等,好像有点问题!你不是说官方采用的是 Queries-per-second 方法吗,怎么用 Questions/Uptime 而不是 Queries/Uptime?请看下图~

其实官方的\s(status)的 Questions 值的结果是来源于 show global status like "Queries"而不是 show global status like "Questions"。所以这里的 Questions 实际上是 Queries,所以我归类为第二种方法"Queries-per-second",没有毛病。

不清楚是否算是一个文字显示上的 BUG ,也许官方自己都在纠结中吧。

TPS的定义和计算方法

相对于 QPS 的定义,TPS 的定义我们不用查看百度百科了,因为在官方文档就可以找到对于 TPS 的说明:

TPSAcronym for “transactionsper second”, a unit of measurement sometimes used in benchmarks. Its value depends on the workloadrepresented by a particular benchmark test, combined with factors that you control such as the hardware capacity and database configuration.

TPS 是 "Transactions Per Second" (每秒事务数)的缩写,是一种用于基准测试的测量单位,是一台数据库服务器在单位时间内处理的事务的个数。它的值取决于一个特定的基准测试所代表的工作负荷,以及其他的因素,如硬件容量和数据库配置。

明确了 TPS 的含义为每秒的事务数,还需要知道在 MySQL 数据库中只有使用了 Innodb 数据库引擎的数据库或表才支持事务,在 MySQL 中现在最常用的存储引擎就是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

潜台词: 别傻傻的和我讨论 MyISAM 存储引擎下的 TPS 了。

关于 TPS 的计算方法,网上也是众说纷纭,我们继续探讨一下真正的 TPS 计算方法。

方法一: 计算增删改查总和方法二: 计算 commit、rollback 总和方法三: 计算 Gtid 增长值

方法一、计算增删改查总和

在前面的 QPS 计算中,我们学会了从show global status里获取一些 SQL 语句计数统计值,用于计算 QPS,TPS 同样地可以。 我们可以获取 com_insert、com_deletecom_updatecom_select来计算 TPS 。

官方文档的解释如下:

Com_xxx The Com_xxx statement counter variables indicate the number of times each xxx statement has been executed. There is one status variable for each type of statement. For example, Com_delete and Com_update count DELETE and UPDATE statements, respectively. Com_delete_multi and Com_update_multi are similar but apply to DELETE and UPDATE statements that use multiple-table syntax.

中文意思是,这个 Com_xxx 语句计数器变量指示每个变量的次数。xxx 语句已执行。每种类型的语句都有一个状态变量。例如,Com_deleteCom_update分别表示执行 DELETE 和 UPDATE 语句的次数。Com_delete_multiCom_update_multi相似,但适用于 DELETE 和 UPDATE 使用多表语法的语句。

这里能发现如果涉及多表删除或者多表更新情况,需要使用的计数变量是Com_delete_multiCom_update_multi

也就是方法一的计算公式为: TPS = 单位时间 t 内 (com_insert+ com_delete+ com_update+ com_select+ Com_delete_multi+ Com_update_multi)的增长值/ 单位时间 t

这里,我们不深究计数器使用得是否正确,由于我们是要计算每秒事务数,鉴于一个事务里可以跑多个 SQL,这种计算公式明显违反了定义,是错误的。

方法二: 计算 commit、rollback 总和

是事务就需要有 begin 和 commit/rollback 语句,对吧。所以计算 commit、rollback 的总和,即计算com_commit+com_rollback,也可以计算出 TPS,对吧?

错错错! MySQL 区别于 Oracle,在 Oracle 里事务是需要显示提交的,必须执行 commit 提交事务。而 MySQL 默认是设置了自动提交的(参数 autocommit=1)。 所以 MySQL 不 commit 也是可以的,只要不显式地包裹了 begin 和 commit/rollback,那么一条 SQL 下发完,就会自动提交,就是一条事务。现在大多数 MySQL 的开发人员都是大量地使用自动提交。

所以会有一个很尬尴的现象,就是: 在一套一主一从的 MySQL 数据库集群里,主库因为不主动执行commit,com_commit为 0 ,所以采用方法二计算出来的 TPS 为 0,而 binlog 是会自动补 commit 语句的,复制到从库时,从库回放 SQL,会带 commit,那么从库会有com_commit,从库的 TPS 是真实的。

这种统计方法,显然是我们不能接受的。

那么我认为,对于方法二,可以按以下思路来改造:

Handler_commit+Handler_rollback+Com_commit+Com_rollback+Com_rollback_to_savepoint+Handler_savepoint_rollback

其中Handler_commitHandler_rollback等打头的计数器是隐式提交的计数器。我只提供思路,不保证数据正确性,具体计算方法,读者可以尝试按这个思路改造。

方法三、用 GTID 计算 TPS

熟悉 MySQL 的同学肯定清楚开启数据库的 GTID 是一项硬性指标,那么 GTID 是什么?

GTID( Global Transaction Identifier)全局事务标识,其保证为每一个在 master 提交的事务在复制集群中可以生成一个唯一的 ID。一个 GITD 由两部分组成的,分别是 source_id 和 transaction_id,结构为 GTID=source_id:transaction_id,其中 source_id 就是执行事务的主库的 server-uuid 值,server-uuid 值是在 mysql 服务首次启动生成的,保存在数据库的数据目录中,在数据目录中有一个 auto.conf 文件,这个文件保存了 server-uuid 值(唯一的)。而 transaction_id 则是从 1 开始自增的序列,表示这个事务是在主库上执行的第几个事务,MySQL 会保证这个事务和 GTID 是一比一的关系。

既然一个事务只会生成一个唯一的 GTID,而且 transaction_id 的部分还是顺序递增的序列,那么根据这个值来计算 TPS 是应该是最准确的一种方式了。

MySQL 5.6 版本开始支持 GTID 功能。

知道了基于GTID来计算TPS最准确,那如何计算呢?在 MySQL 上,可以使用 show master status命令来查看 Executed_Gtid_Set的值,这个值表示已经在这个实例上执行的 GTID集合。

如果是从库,执行show slave status中输出的对应列Executed_Gtid_Set,含义也相同。

比如下面这种情况,直接可以根据单位时间内两次输出结果 GTID 数值差值与单位时间之商计算得出 TPS。

mysql> show master status \G*************************** 1. row ***************************             File: mysql-bin.000006         Position: 926206     Binlog_Do_DB:  Binlog_Ignore_DB: Executed_Gtid_Set: 59bf2dea-e3b5-11eb-ae63-02000aba3f7b:1-25161 row in set (0.00 sec)

这里可能有人会说,我这没算对,因为我这里使用的 GTID 确实可以保证所有计数都是事务的,但并没有包含 select 类型的事务。

我给出两个解释吧:

前面提到了,GTID( Global Transaction Identifier)表示全局事务标识,GTID 没有给 select only 的事务一个 GTID 编号,也就是官方根本没有打算把这类查询的事务认为是事务,所以 GTID 本身确实是一种狭义的事务的概念,所以我们这边计算的 TPS 也是一种狭义的 TPS,但问题是,这就是我们真正需要的 TPS!如果您关注业务的读,大可以看 QPS,如果您关注事务,关注业务的写入,那就看 TPS,我的定义更利于实现这个读写维度分离的关注。

总结一下

本文探讨了 QPS 和 TPS 的各种计算方法,并给出我们认为的最佳计算方法。

[ES三周年]如何计算数据库的TPS和QPS

2023-03-20 14:07:48

外资持续看好鸿合科技,连续5日获深股通增持

2023-03-20 12:04:32

瑞银首席执行官警告员工:在交易完成前 瑞信仍是“我们的竞争对手”-每日看点

2023-03-20 10:12:05

李亚鹏海哈金喜被曝婚变!女方恐成前妻替身,小女儿名字暗藏深意

2023-03-20 08:09:58

赫尔库拉的复仇怎么交_赫尔库拉的复仇|环球热推荐

2023-03-20 03:12:05

手指游戏中班视频_手指游戏-当前信息

2023-03-19 22:12:20

别催 你的外卖小哥可能正在救火-环球时讯

2023-03-19 18:39:18

【出警笔记】别怕 我们帮你找家人 环球快播

2023-03-19 15:06:43

hop_hop

2023-03-19 12:00:14

吴莎照片 个人简介_吴莎身高个人简介 每日看点

2023-03-19 07:59:10

最新消息:位图图像是由什么来描述图像的_请简述位图图像的特点

2023-03-19 03:00:40

我们什么时候才能等到VR版“黑悟空”? 世界聚焦

2023-03-18 22:05:55

近朱者赤近墨者黑所蕴含的道理与蓬生麻中不扶而直相似_近朱者赤近墨者黑所蕴含的道理_今热点

2023-03-18 18:38:15

当前动态:倪海厦天纪视频全集+电子书合集,网盘2023免费下载

2023-03-18 15:12:19

名人介绍模板_名人介绍 天天播资讯

2023-03-18 12:04:42

保险证书查询网_保险证书查询

2023-03-18 08:57:38

旺能环境(002034):3月17日北向资金增持18.95万股 天天关注

2023-03-18 04:22:37

徐建青:XBB会再度暴击中国吗?数据提示:峰值不会太高

2023-03-18 00:02:00

天天观热点:德伯维尔家的苔丝/名著名译汉英双语文库

2023-03-17 20:51:37

毁三观!“三光书记”举办“情妇群芳宴”,22名情妇个个赛西施 天天即时

2023-03-17 18:03:02

外交部:亚太地区不是地缘博弈的竞技场 热推荐

2023-03-17 16:12:12

全球观热点:哪吒汽车儿童模式控制方法专利公布

2023-03-17 14:04:40

盐湖环评遇阻,阿根廷当局建议“大幅降低开采量”,西藏珠峰早盘大跌

2023-03-17 11:23:09

世界新资讯:kickasstorrents_kickass torrents

2023-03-17 09:40:00

香港故宫文化博物馆开馆至今逾89万人次到访

2023-03-17 07:19:47

LOL:RNG强势横扫滔博,乌兹直播解说,谈到Betty他居然这么说!

2023-03-17 02:55:38

新诺威: 2022年度独立董事述职报告(耿立校)

2023-03-16 22:15:05

热门看点:中公高科:2022年度净利润同比增长1.76% 拟10股派1.15元

2023-03-16 19:52:52

济宁市总工会举办业务能力提升培训班|环球关注

2023-03-16 17:23:10

国防部:日方应切实汲取历史教训在军事安全领域谨言慎行 当前热议

2023-03-16 15:39:24

库尔勒市:香梨技术培训助力增产增收

2023-03-16 13:16:35

2023南通市海门区招聘教师报名时间+入口

2023-03-16 11:02:08

孤峰油布伞 千年雨中花_全球新要闻

2023-03-16 09:59:54

err1是什么意思中文翻译_err1是什么意思_世界热讯

2023-03-16 05:59:35

新乡市新型冠状病毒肺炎疫情:3月16日新乡市疫情最新消息今天数据统计情况通报

2023-03-16 01:03:25

ps怎么裁剪图片一部分_ps怎么裁剪不规则图形

2023-03-15 21:04:49

东华大学是双一流大学吗是一流学科建设高校吗算是名校吗

2023-03-15 19:00:43

同学们上了一堂生动的“消费安全课”

2023-03-15 16:52:35

基金315:交银施罗德基金收到39起投诉 投诉内容与无故扣款、获取用户私人信息等有关

2023-03-15 14:47:23

快消息!路边停的共享汽车怎么用_共享汽车怎么用

2023-03-15 12:03:01

经典古文朗读_经典古文-全球热推荐

2023-03-15 10:00:34

当前视讯!03月15日06时河北石家庄昨日累计报告阳性感染者确诊1728例 怎么判断自己是否属于轻型感染者

2023-03-15 07:59:07

犬字开头的成语_哪些成语是犬字开头

2023-03-15 04:02:58

2023扬州学考成绩在哪查询_最新

2023-03-14 22:53:59

手机丢了怎么登录微信不知道密码_手机丢了怎么登陆微信-每日速讯

2023-03-14 19:58:27

格力地产4亿元公司债券将付年息 票面利率7.00% 天天热资讯

2023-03-14 17:06:50

巴以关系的回顾和前瞻_世界视点

2023-03-14 15:04:30

天天信息:赛力斯3月14日盘中涨幅达5%

2023-03-14 13:17:48

今日热闻!天津医科大学肿瘤医院工会职工小家打造“幸福家园”

2023-03-14 11:08:01

渤海证券:预计今年品牌服饰板块将迎来较为良好的业绩表现|世界报资讯

2023-03-14 08:57:01

广汽回应气囊伤人祺gs5气囊怎么拆_广汽回应气囊伤人|天天热点

2023-03-14 05:02:35

造梦西游3神兽森林隐藏副本怎么打 造梦西游3神兽森林隐藏副本怎么进

2023-03-13 23:04:52

科学家的小故事简短4个_科学家的小故事_简短一点 世界头条

2023-03-13 19:55:41

环球即时看!跟着央视,和全国观众一起沉浸式打卡佛山!

2023-03-13 17:06:43

魔兽金珍珠黑珍珠(魔兽金珍珠哪里刷)-今日精选

2023-03-13 15:14:49

焦点讯息:今日自己的特长有哪些方面_个人特长有哪些方面

2023-03-13 13:00:49

白再兴调研教育工作_当前滚动

2023-03-13 10:06:22

奔腾b50油耗高怎么解决_奔腾b50油耗 世界微速讯

2023-03-13 07:58:08

当前观察:中级财务会计第七版pdf_中级财务会计教材电子版

2023-03-13 03:17:00

无创dna怎么看出男女_无创dna可以看出男女吗

2023-03-12 21:48:31

小米控制中心怎么修改样式|环球今日讯

2023-03-12 17:43:31

手游代理记住这几点就可以做出流水_全球微动态

2023-03-12 14:01:32

焦点观察:植物与僵尸作品吧

2023-03-12 09:56:36

完颜阿骨打_说一说完颜阿骨打的简介-当前简讯

2023-03-12 05:59:08

世界速看:璧山区气象局发布大风蓝色预警【Ⅳ级/一般】【2023-03-11】

2023-03-11 23:14:31

任达华为了拍戏,学会“小偷”绝技,现场表演,惊呆鲁豫

2023-03-11 19:00:33

小龙女宁死不杀尹志平,是因为爱?同为女人的黄蓉戳穿了她的心思 世界通讯

2023-03-11 15:16:00

衡永高速线路图祁东段_永衡高速经过祁东哪些地方|世界速看

2023-03-11 13:18:26

全球观点:7吨假冒伪劣商品集中销毁

2023-03-11 11:13:14

利用完全立方公式推导方程_利用完全立方公式推导_当前时讯

2023-03-11 08:09:01

十个天才的精神病史

2023-03-11 07:41:13

北上资金逆势加仓中字头|看热讯

2023-03-11 05:57:46

世界报道:杭州爱音助听器材有限公司_关于杭州爱音助听器材有限公司简述

2023-03-11 00:08:56

世界今日讯!国泰君安: 国泰君安证券股份有限公司2023年度第二期短期融资券发行结果公告

2023-03-10 20:51:41

土木工程就业前景及就业岗位_土木工程就业前景

2023-03-10 16:19:19

自然资源部:急用先行 2025年中国自动驾驶将有地图支撑

2023-03-10 15:59:28

全球微头条丨怎么共享文件_怎样设置共享文件夹

2023-03-10 13:51:08

环球头条:三阶魔方教程详细图解说明书_三阶魔方教程详细图解

2023-03-10 11:11:03

光通量计算_环球播报

2023-03-10 10:54:08

迪士尼CEO艾格暗示需调整Disney+的定价策略

2023-03-10 09:29:03

西媒:皇马对纳乔的评估报告结果良好,但球员生涯首次考虑离开

2023-03-10 05:54:21

1000kva等于多少千伏_1000kva等于多少kw

2023-03-10 05:02:10

相生相克打一字_相生相克打一数字

2023-03-10 01:21:23

春季只为你而歌唱_对于春季只为你而歌唱简单介绍 快播报

2023-03-09 22:03:27

辛德勒名单完整版在线_辛德勒的名单免费完整

2023-03-09 19:12:08

领失业金期间医保住院可以报销吗 失业保险金可以领几个月?

2023-03-09 18:56:00

每日热点:03月09日15时江苏连云港疫情数据 阳了以后为什么会腰疼?应该怎么办?

2023-03-09 16:56:51

广西横州以精准监督护航平陆运河项目建设

2023-03-09 15:44:49

全球观焦点:新生婴儿有必要看早教黑白卡吗_黑白早教卡正确使用

2023-03-09 13:49:14

乌克兰:因俄军导弹大规模攻击,乌全境紧急停电 全球报资讯

2023-03-09 13:28:33

【世界独家】为黑土地注入生机——梨树县打造绿色种养循环新模式见闻

2023-03-09 11:14:44

国家统计局:2月飞机票、交通工具租赁费和旅游价格分别下降12.0%、9.5%和6.5%-实时

2023-03-09 09:42:50

全球今热点:交通安全亲子绘画作品图片_交通安全亲子绘画

2023-03-09 08:03:54

广西壮族自治区桂林市地质系列图集

2023-03-09 07:04:38

每日热点:怀孕20周乳头挤出透明的水是什么_怀孕20天症状

2023-03-09 00:59:13

焦点消息!澳洲旅游要花多少钱 去澳大利亚旅游一次要花多少钱

2023-03-08 22:58:21

〖孔明·解密〗3月8日涨停个股揭秘

2023-03-08 21:06:36

【天天时快讯】地菜花煮鸡蛋的功效

2023-03-08 18:57:49

易瑞生物:子公司取得2个医疗器械注册证_世界快看点

2023-03-08 17:57:41

茭白怎么做好吃_茭白的做法

2023-03-08 16:12:15