计算 TPS,QPS、IOPS 的方式
在做db基准测试的时候,qps,tps 是衡量数据库性能的关键指标。本文比较了网上的两种计算方式。先来了解一下相关概念。
概念介绍:
QPS:Queries Per Second 查询量/秒,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理查询量多少的衡量标准。
TPS : Transactions Per Second 是事务数/秒,是一台数据库服务器在单位时间内处理的事务的个数。
IOPS:(Input/Output operations Per Second,既每秒处理I/O的请求次数)
IOPS是指存储每秒可接受多少次主机发出的访问,主机的一次IO需要多次访问存储才可以完成,这里提到磁盘读写能力,比如它每秒读100M,写50M.这个说明的是数据吞吐量,而IOPS指的则是每秒处理I/O的请求次数.详细展开来说请求次数就是读80M的文件是一次I/O请求,写1K的的数据也是一次I/O请求,那么IOPS的数值越高自然在一定时间内能接受的相应请求就越多,如果你在深入想一下也会发现这只是理论而已.因为同一个请求读80M与写1K所需要的时间自然不一样,除了寻道、数据传输等方面考虑的因素其实很多很多,那么如果IOPS够高的话,那么用在OLTP系统上会更加合适.对于如何获得IOPS的值,在Linux、Windows上都有很多工具可供测试,不过可参考的价值未必多.如果要提高IOPS,传统方案还是使用RAID条带后使I/O能力获得提升,近几年固态硬盘SSD很火热,不同厂商之间的技术指标也不尽相同,至于像Fusion-IO这种变态级的IOPS都可以干到百万级别.一般情况下用SSD基本上可以满足需求了.多块SSD条带性能还是很猛的.不过烧钱烧的多还有就是寿命问题.
IOPS的计算公式IOPS=1000ms/(寻道时间+旋转延迟时间)
如何计算:
从网上查看如果获取mysql 的qps,tps 的方法有如下两种:
方法一 基于 questions 计算qps,基于 com_commit com_rollback 计算tps
questions = show global status like 'questions';
uptime = show global status like 'uptime';
qps=questions/uptime
com_commit = show global status like 'com_commit';
com_rollback = show global status like 'com_rollback';
uptime = show global status like 'uptime';
tps=(com_commit + com_rollback)/uptime
方法二 基于 com_* 的status 变量计算tps ,qps
使用如下命令:
show global status where variable_name in('com_select','com_insert','com_delete','com_update');
获取间隔1s 的 com_*的值,并作差值运算
del_diff = (int(mystat2['com_delete']) - int(mystat1['com_delete']) ) / diff
ins_diff = (int(mystat2['com_insert']) - int(mystat1['com_insert']) ) / diff
sel_diff = (int(mystat2['com_select']) - int(mystat1['com_select']) ) / diff
upd_diff = (int(mystat2['com_update']) - int(mystat1['com_update']) ) / diff
上述计算方法的值准确合适吗?
下图是我手工做测试的结果:
a 针对mysql innodb 表的dml 操作做了各个量的统计,结果如下:
由上图可以得出结论:
1 com_commit, com_rollback 与显示指定transaction无关,只和显式提交commit rollback 有关。
2 不管dml的结果是否成功,com_* 都会增加1 。
b 针对myisam 表的测试:
1 对于myisam 表 进行dml操作 只有questions 改变其他值不变。
2 对于myisam 存储引擎使用com_* 计算其tps,qps 是不准确的,使用questions 的值计算相对比较合适。
利用脚本使用不同的变量获取数据库的qps,tps 的对比图:
qps_s 是基于 com_select
qps_ques 是基于 questions ,
tps_iud 是基于 com_insert, com_update,com_delete 之和,
tps_com_rol是基于 com_commit com_rollback 之和
由上图可以查看 基于questions 要比基于com_select的数值要大,因为questions本身是所有db访问的集合。
总结:
Questions 是记录了从mysqld启动以来所有的select,dml 次数包括show 命令的查询的次数。这样多少有失准确性,比如很多数据库有监控系统在运行,每5秒对数据库进行一次show 查询来获取当前数据库的状态,而这些查询就被记录到QPS,TPS统计中,造成一定的"数据污染".
如果数据库中存在比较多的myisam表,则计算还是questions 比较合适。
如果数据库中存在比较多的innodb表,则计算以com_*数据来源比较合适。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)