基准测试工具能够用来对数据库或者操做系统调优后的性能进行对比。MySQL数据库自己提供了一些比较优秀的工具,这里介绍另外两款更优秀、更经常使用的工具:sysbench和mysql-tpcc。mysql
sysbench是一个模块化的、跨平台的、多线程基准测试工具,主要用于测试各类不一样系统参数下的数据库负载状况。sql
它主要包括如下几种测试方式:数据库
sysbench的数据库OLTP测试支持MySQL、PostgreSQL和Oracle。目前sysbench主要用于Linux操做系统,开源社区已经将sysbench移植到Windows,并支持对Microsoft SQL Server数据库的测试。windows
sysbench的官网地址是:http://sysbench.sourceforge.net,能够从上述地址下载最新版本的sysbench工具,而后编译和安装。此外,有些Linux操做系统发行版本(如RED HAT),可能自己已经提供了sysbench的安装包,直接安装便可。服务器
对于InnoDB存储引擎的数据库应用来讲,咱们可能更关心的是磁盘和OLTP的性能,所以主要测试fileio和oltp这两个项目。多线程
对于磁盘的测试,sysbench提供了如下的测试选项:架构
sysbench --test=fileio help异步
各个参数的含义以下所示:socket
--file-num:生成测试文件的数量,默认为128。async
--file-block-size:测试期间文件块的大小,若是你想磁盘针对InnoDB存储引擎进行测试,能够将其设置为16 384,即InnoDB存储引擎页的大小。默认为16 384。
--file-total-size:每一个文件的大小,默认为2GB。
--file-test-mode:文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)和rndrw(随机读写)。
--file-io-mode:文件操做的模式,同步仍是异步,或者选择MMAP(map映射)模式。默认为同步。
--file-extra-flags:打开文件时的选项,这是与API相关的参数。
--file-fsync-freq:执行fsync函数的频率。fsync主要是同步磁盘文件,由于可能有系统和磁盘缓冲的关系。
--file-fsync-all:每执行完一次写操做,就执行一次fsync。默认为off。
--file-fsync-end:在测试结束时执行fsync。默认为on。
--file-fsync-mode:文件同步函数的选择,一样是和API相关的参数,因为多个操做系统对于fdatasync支持的不一样,所以不建议使用fdatasync。默认为fsync。
--file-rw-ratio:测试时的读写比例,默认时读写2:1。
sysbench的fileio测试须要通过prepare、run和clean三个阶段。
如咱们进行16个文件、总大小2GB的fileio测试:
sysbench --test=fileio --file -num=16 --file -total -size=2G prepare
接着在相应的目录下就会产生16个文件了,由于总大小是2GB,因此每一个文件的大小应该是128MB:
接着就能够基于这些文件进行测试了,下面是在16个线程下的随机读取性能:
sysbench --test=fileio --file -total -size=2G --file -test -mode=rndrd --max -time=180 --max -requests=100000000 --num -threads=16 --init -rng=on --file -num=16 --file -extra -flags=direct --file -fsync -freq=0 --file -block -size=16384 run
上述测试的最大随机读取请求是100 000 000次,若是在180秒内不能完成,测试即结束。
测试结束后能够看到以下的测试结果:
sysbench --test=fileio --file -total -size=2G --file -test -mode=rndrd --max -time=180 --max -requests=100000000 --num -threads=16 --init -rng=on --file -num=16 --file -extra -flags=direct --file -fsync -freq=0 --file -block -size=16384 run
能够看到随机读取的性能为53.81MB/sec,随机读的IOPS为3443.85。测试的硬盘是固态硬盘,所以随机读取的性能较为强劲。此外还能够看到每次请求的一些具体数据,如最大值、最小值、平均值等。
测试结束后,记得要执行clean,以确保测试所产生的文件都已删除:
sysbench --test=fileio --file -num=16 --file -total -size=2G cleanup
可能你须要测试随机读、随机写、随机读写、顺序写、顺序读等全部这些模式,而且还可能须要测试不一样的线程和不一样文件块下磁盘的性能表现,这时你可能须要相似以下的脚原本帮你自动完成这些测试:
#!/bin/sh set-u set-x set-e for size in 8G 64G;do for mode in seqrd seqrw rndrd rndwr rndrw;do for blksize in 4096 16384;do sysbench--test=fileio--file-num=64--file-total-size=$size prepare for threads in 1 4 8 16 32;do echo"======testing$blksize in$threads threads" echo PARAMS$size$mode$threads$blksize>sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize for i in 1 2 3;do sysbench--test=fileio--file-total-size=$size--file-test-mode=$mode\ --max-time=180--max-requests=100000000--num-threads=$threads--init-rng=on\ --file-num=64--file-extra-flags=direct--file-fsync-freq=0--file-block-size=$blksize run\ |tee-a sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize 2>&1 done done sysbench--test=fileio--file-total-size=$size cleanup done done done
对于mysql的OLTP测试,和fileio同样,一样须要经历prepare、run和cleanup的阶段。prepare阶段会根据选项产生一张指定行数的表,默认表在sbtest架构下,表名为sbtest(sysbench默认生成表的存储引擎为InnoDB),如建立一张有8000万条记录的表:
sysbench --test=oltp --oltp -table -size=80000000 --db -driver=mysql --mysql-socket=/tmp/mysql.sock --mysql-user=root prepare
接着就能够根据产生的表进行oltp的测试:
sysbench --test=oltp --oltp -table -size=80000000 --oltp -read -only=off --init -rng=on --num -threads=16 --max -requests=0 --oltp -dist -type=uniform --max -time=3600 --mysql -user=root --mysql -socket=/tmp/mysql.sock --db -driver=mysql run>res
咱们将测试结果放入了文件res中。
结果中罗列出了测试时不少操做的详细信息,transactions表明了测试结果的评判标准,即TPS,上述测试的结果是119.9tps。你能够对数据库进行调优后再运行sysbench的oltp测试,看看tps是否有所提升。注意,sysbench的测试只是基准测试,并不表明实际企业环境下的性能指标。
TPC(Transaction Processing Performance Council,事务处理性能协会)是一个评价大型数据库系统软硬件性能的非盈利组织。TPC-C是TPC协会制定的,用来测试典型的复杂OLTP(在线事务处理)系统的性能。目前,在学术界和业界,广泛采用TPC-C来评价OLTP应用的性能。
TPC-C用3NF(第三范式)虚拟实现了一家仓库销售供应商公司,拥有一批分布在不一样地方的仓库和地区分公司。当公司业务扩大时,将创建新的仓库和地区分公司。一般每一个仓库供货覆盖10家地区分公司,每一个地区分公司服务3000名客户。该公司共有100 000种商品,分别储存在各个仓库中。该系统包含了库存管理、销售、分发产品、付款、订单查询等一系列操做,一共包含了9个基本关系,基本关系图以下图所示。
TPC-C的性能度量单位是tpmC,tpm是transaction per minute的缩写,C表明TPC的C基准测试。该值越大,表明事务处理的性能越高。
tpcc-mysql是开源的TPC-C测试工具,该测试工具彻底遵照TPC-C的标准。其官方网站为:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql。以前tpcc-mysql主要工做在Linux操做系统上,我已经将其移植到了Windows平台,能够在http://code.google.com/p/david-mysql-tools/downloads/list下载到windows版本的tpcc-mysql。
tpcc-mysql由如下两个工具组成:
tpcc_load:根据仓库数量,生成9张表中的数据。
tpcc_start:根据不一样选项进行tpcc测试。
tpcc_load命令的使用方法以下所示:tpcc_load
usage:
tpcc_load[server][DB][user][pass][warehouse]
OR
tpcc_load[server][DB][user][pass][warehouse][part][min_wh][max_wh]*[part]:1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
上述各参数解析以下:
server:导入的MySQL服务器IP。
DB:导入的数据库。
user:mysql的用户名。
pass:mysql的密码。
warehouse:要生产的仓库数量。
若是用tpcc_load工具建立100个仓库的数据库tpcc,能够这样:
mysql tpcc<create_table.sql
mysql tpcc<add_fkey_idx.sql
tpcc_load 127.0.0.1 tpcc2 root xxxxxx 100
tpcc_start命令的使用方法以下所示:tpcc_start
usage:tpcc_start[server][DB][user][pass][warehouse][connection][rampup][measure]
相关参数的做用以下:
connection:测试时的线程数量。
rampup:热身时间,单位为秒,这段时间的操做不计入统计信息。
measure:测试时间,单位为秒。
如咱们使用tpcc_start进行16个线程的测试,热身时间为10分钟、测试时间为20分钟,以下代码所示。
tpcc_start 127.0.0.1 tpcc root xxxxxx 100 16 600 1200
在测试的时候,你也许会在终端上看到以下输出:
RAMP-UP TIME.(1 sec.)
MEASURING START.
10,624(0):0.4,624(0):0.2,62(0):0.2,63(0):0.6,62(0):0.8
20,990(0):0.2,988(0):0.2,98(0):0.2,99(0):0.4,98(0):0.6
30,1435(0):0.2,1436(0):0.2,144(0):0.2,143(0):0.2,144(0):0.4
这些信息是每10秒tpcc测试的结果数据,tpcc测试一共测试5个模块,分别是New Order、Payment、Order-Status、Delivery、Stock-Level。
第一个值即为New Order,这也是TPCC测试结果的一个重要考量标准New Order Per 10 Second(每十秒订单处理能力),能够将测试时全部的数据组成一张折线图或散点图,观察InnoDB存储引擎每10秒的性能表现。而tpcc_load最后结束时产生的tpmC,也是经过New Order Per 10 Second来进行的:首先求出New Order Per 10 Second的平均值,而后乘以6,获得的就是最终的tpmC。