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