MySQL的测试工具,推荐用sysbench。虽然hammerora、super-mark、tpc-c等一些其他工具也很强大,但sysbench的文件I/O测试与InnoDB的行为很相似,针对MySQL也有比较完善的测试模型,还可以方便地修改lua脚本,以实现更强大、更灵活的测试功能。其实,设计sysbench的初衷就是为了衡量MySQL的性能,而很多其他工具,对于MySQL的支持往往只是一个选项,功能还不够强大,难以模拟真实的数据库负荷。MySQL自带的mysqlslap也是一个不错的工具,它是从5.1.4版开始的一个MySQL官方提供的压力测试工具,可通过模拟多个并发客户端访问MySQL来执行压力测试。
这两个工具可以满足大部分情况下的性能测试和压力测试。sysbench可以自定义lua脚本,开发人员可以编写适合自己业务逻辑的lua脚本。当然也可以使用其他高级语言编写测试工具,这样会更灵活,更接近实际业务数据库操作。
1.sysbench的使用
目前sysbench主要支持MySQL、PostgreSQL、Oracle这3种数据库。
它主要包括以下几种方式的测试。
·Fileio:文件I/O测试。
·Cpu:CPU性能测试。
·Memory:内存性能测试。
·Threads:线程性能测试。
·Mutex:Mutex性能测试。
·Oltp:OLTP测试,MySQL一般会选择此种测试类型。
(1)安装
首先,从https://github.com/akopytov/sysbench 下载源码包,单击Download Zip。然后,按照如下步骤进行安装。
unzip sysbench-0.5.zip
cd sysbench-0.5
./autogen.sh
./configure --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql
若是二进制安装:
(./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib)
make
make install
用如上的参数进行编译的话,需要确保你的MySQL lib目录下有对应的库文件,如果没有,则可以下载devel或share包来进行安装。也可以下载MySQL的二进制安
装包解压到/usr/local/mysql下。
(2)开始测试
在sysbench--test=memory命令后添加help可以查看帮助。
sysbench --test=memory help
一些参数解析如下。
·--percentile 95%:响应时间,也就是删除5%的响应时间最长的请求,然后从剩余的请求中选取最大的响应时间值。
·--max-time:运行时间限制,单位是秒。
·--num-threads:线程数。
·--max-requests:查询数限制。
下面来举例说明。
1)CPU性能测试。
sysbench --test=cpu --cpu-max-prime=20000 run
CPU测试主要是进行素数的运算,在上面的例子中,指定了最大的素数为20000,也可以根据机器CPU的性能来适当调整数值。
如下命令,执行20s就输出了,而不会等待命令执行完。
sysbench --test=cpu --cpu-max-prime=20000 run --max-time=20
2)线程测试。
sysbench --test=threads --num-threads=64 --thread-yields=1000 --thread-locks=8 run
3)磁盘I/O性能测试。
sysbench --test=fileio --num-threads=16 --file-total-size=12G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=12G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=12G --file-test-mode=rndrw cleanup
定创建文档的总大小为12GB,--file-test-mode指定文档的读写模式为随机读写。
磁盘I/O性能测试是进行数据库基准测试时要着重加以研究的。我们需要衡量各种因素,比如操作类型、读写的频率、I/O大小、是随机读写还是顺序读写、写的
类型是异步还是同步、并发线程情况、操作系统缓存状态及文件系统有哪些调优等因素。
文件测试类型(file-test-mode)有如下几种。
·seqwr:顺序写。
·seqrewr:顺序重写(rewrite)。
·seqrd:顺序读。
·rndrd:随机读。
·rndwr:随机写。
·rndrw:随机读写。
4)内存测试。
sysbench --test=memory --memory-block-size=8K --memory-total-size=4G run
上述参数指定了本次测试的整个过程是在内存中传输4GB的数据量,每个块(block)的大小为8KB。
5)OLTP测试。
在测试之前请预先创建数据库,并给予测试用户足够的权限。
mysql > create database sbtest;
mysql > grant all privileges on sbtest.* to test@’
localhost’
identified by ‘
test’
;
如下例子演示了多线程如何测试MySQL。
首先初始化数据。
sysbench --test=./sysbench/tests/db/oltp.lua --mysql-table-engine=innodb --oltp-tables-count=256 --oltp-table-size=1000000 --mysql-user=test --mysqlpassword=
test --mysql-socket=/tmp/mysql.sock prepare
上述参数指定了本次测试的表存储引擎类型为InnoDB,指定了表的最大记录数为1000000,初始化生成256个表。测试OLTP时,可以自己先创建数据库sbtest,或
者自己用参数--mysql-db来指定其他数据库。
然后进行实际测试,测试模型是OLTP,并发8个线程,执行1个小时,如下:
sysbench --test=./sysbench/tests/db/oltp.lua --oltp-tables-count=256 --oltp-table-size=1000000 --mysql-user=test --mysql-password=test --mysqlsocket=/
tmp/mysql.sock --max-time=3600 --max-requests=0 --num-threads=8 --report-interval=10 run
其中,--report-interval=10表示每10s就输出一次数据,输出格式类似如下。
[ 10s] threads: 2, tps: 290.39, reads: 4065.82, writes: 1161.58, response time: 8.65ms (95%), errors: 0.00, reconnects: 0.00
[ 20s] threads: 2, tps: 270.90, reads: 3795.10, writes: 1083.80, response time: 10.14ms (95%), errors: 0.00, reconnects: 0.00
[ 30s] threads: 2, tps: 277.40, reads: 3883.50, writes: 1109.40, response time: 9.82ms (95%), errors: 0.00, reconnects: 0.00
[ 40s] threads: 2, tps: 273.50, reads: 3828.09, writes: 1094.00, response time: 9.93ms (95%), errors: 0.00, reconnects: 0.00
测试完成后,清理数据。
sysbench --test=./sysbench/tests/db/oltp.lua --oltp-tables-count=256 --oltp-table-size=1000000 --mysql-user=test --mysql-password=test --mysqlsocket=/
tmp/mysql.sock cleanup