今天是妇女节,先祝所有过节的女同胞们节日快乐:) 即将对mysql进行性能测试。所以事先对mysql的测试工作进行一番了解。主要考察性能测试的工具,mysql的关键指标,以及一些基础的benchmark数据,为测试用例和场景的规划做些准备。 先说说考量的指标(转载
今天是妇女节,先祝所有过节的女同胞们节日快乐:)
即将对mysql进行性能测试。所以事先对mysql的测试工作进行一番了解。主要考察性能测试的工具,mysql的关键指标,以及一些基础的benchmark数据,为测试用例和场景的规划做些准备。
先说说考量的指标(转载,网址找不到了,抱歉)
(1)qps(每秒query量)
qps = questions(or queries) / seconds
mysql > show /*50000 global */ status like 'question';
(2)tps(每秒事务量)
tps = (com_commit + com_rollback) / seconds
mysql > show status like 'com_commit';
mysql > show status like 'com_rollback';
(3)key buffer 命中率
key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%
mysql> show status like 'key%';
(4)innodb buffer命中率
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%
mysql> show status like 'innodb_buffer_pool_read%';
(5)query cache命中率
query_cache_hits = (qcahce_hits / (qcache_hits + qcache_inserts )) * 100%;
mysql> show status like 'qcache%';
(6)table cache状态量
mysql> show status like 'open%';
(7)thread cache 命中率
thread_cache_hits = (1 - threads_created / connections ) * 100%
mysql> show status like 'thread%';
mysql> show status like 'connections';
(8)锁定状态
mysql> show status like '%lock%';
(9)复制延时量
mysql > show slave status
(10) tmp table 状况(临时表状况)
mysql > show status like 'create_tmp%';
(11) binlog cache 使用状况
mysql > show status like 'binlog_cache%';
(12) innodb_log_waits 量
mysql > show status like 'innodb_log_waits';
其中qps和tps自然是重点考察的性能指标。其他指标可以作为每次测试数据的参考数据列出。如果遇到瓶颈,可能还需要考量当时系统的cpu,网络,磁盘的利用率情况。这个遇到具体问题再具体分析。
工具方面,首选考察的自然是mysql自带的测试工具mysqlslap。
./mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -proot
一个简单的示例即可说明工具的使用情况,
-a 自动生成sql
--concurrency=50,100分别执行50,100并发,
--iterations=5 执行5次,引擎分别选用myisam和innodb引擎测试。
--number-of-queries limit each client to this number of queries (this is not
exact).(一个客户端执行的测试sql数量上限,通过--only-print观察自动生成的sql的执行情况来看,该条数限制的是准备数据以外的sql语句的条数)
--engine=myisam,innodb 分别用myisam和innodb引擎进行测试。
当然你也可以通过-q指定你想要测试的sql脚本,测试结束后,mysqlslap会给出你测试的相关数据。
关于mysqlslap的更多参数可参考:http://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html
从目前来看上手还是比较容易的。通过执行的query数量和时间,很容易计算出tps和qps等指标。
sysbench
也是mysql官网提到的一个benchmark工具。只是在64位系统下安装困难,限于网络环境和考虑到其功能和我们即将进行的测试场景,暂时放弃。
性能测试基础准备其他话题
在思考和验证怎样使用mysqlslap规划测试场景的过程中,收获到一些离散的细节问题,也在此一并记录一下。也许哪天,哪一条就会有所帮助。
打开mysql general_log 记录执行的sql情况
默认情况下该属性是关闭的,通过set global general_log=on 打开后,可在log文件中查看数据库执行的sql记录。该需求是onecoder想要考察jdbc的batch insert的提交方式,究竟是数据库中是执行的多条insert然后commit还是一个insert values大列表的时候产生的。
对比批量插入数据 多条insert和一条insert 大values列表(values(),(),())方式,性能差别
从目前通过mysqlslap执行测试的效果来看,后者明显优于前者。前者1000条平均时间大约是0.2ms,而后者在0.1ms左右。该测试想法是在通过mysqldump到处已有数据的时候发现其sql文件的生成方式的时候以及联想到oracle到mysql的数据迁移工具的处理方式的时候想到的。
写入性能瓶颈的一个大误解
曾经极大的错误的认为单线程下mysql可处理的批量插入数据量就是该节点的瓶颈,所以只认为多线程并发写入优化只在ndb的环境下才有效。今天在看mysql的一些benchmark图表曲线的时候,猛然惊醒,并发数和tps的曲线是类抛物线的就说明在一定并发数的范围内,tps是有明显提高的。于是用以前的jdbc的代码,增加了几个线程,对同一个mysql并发写入,果然tps成倍提升。
今天总结的大概就这么多,由于是事后回忆总结,不免有所遗漏,想起来再补充把。热烈欢迎指导。
原文地址:mysql性能测试—前期知识储备, 感谢原作者分享。