使用sysbench 对mysql进行性能测试

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下操作都将以支持MySQL数据库为例进行。

1. 安装

操作系统:Centos 6.8 x86-64

安装依赖

yum install m4 autoconf automake libtool

安装sysbench

wget http://olvimidkv.bkt.clouddn.com/sysbench-0.4.12-1.1.tgz
tar -xf sysbench-0.4.12-1.1.tgz
cd sysbench-0.4.12-1.1
./autogen.sh
编译
./configure --with-mysql-includes=/home/xiaohe/mysql-3306/include/ --with-mysql-libs=/home/xiaohe/mysql-3306/lib/
# 默认安装只支持MySQL,如果要支持pgsql/oracle 就需要在编译的时候加上--with-pgsql 或 --with-oracle
安装
make && make install

因为是指定路径编译安装的所以会报下面的错误

sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

说明sysbench无法找到mysql的库文件,因此需要指定mysqllib的路径

export LD_LIBRARY_PATH=/home/xiaohe/mysql-3306/lib/
最好写到/etc/profile里面,这样就不会每次登陆都要设置了

sysbench --help  如果不报错,就说明成功了。

按照文档一般不会出错,要是还是出错,请Google。

参数说明

好多英文,自己体会,用的时候仔细看看。

[root@XH-TEST-01 ~]# sysbench --help
Usage: 用法:
  sysbench [general-options]... --test=<test-name> [test-options]... command

General options: 基本选项
  --num-threads=N             number of threads to use [1]
  --max-requests=N            limit for total number of requests [10000]
  --max-time=N                limit for total execution time in seconds [0]
  --forced-shutdown=STRING    amount of time to wait after --max-time before forcing shutdown [off]
  --thread-stack-size=SIZE    size of stack per thread [64K]
  --tx-rate=N                 target transaction rate (tps) [0]
  --report-interval=N         periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0]
  --report-checkpoints=[LIST,...]dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. []
  --test=STRING               test to run
  --debug=[on|off]            print more debugging info [off]
  --validate=[on|off]         perform validation checks where possible [off]
  --help=[on|off]             print help and exit
  --version=[on|off]          print version and exit [off]
  --rand-init=[on|off]        initialize random number generator [off]
  --rand-type=STRING          random numbers distribution {uniform,gaussian,special,pareto} [special]
  --rand-spec-iter=N          number of iterations used for numbers generation [12]
  --rand-spec-pct=N           percentage of values to be treated as 'special' (for special distribution) [1]
  --rand-spec-res=N           percentage of 'special' values to use (for special distribution) [75]
  --rand-seed=N               seed for random number generator, ignored when 0 [0]
  --rand-pareto-h=N           parameter h for pareto distibution [0.2]

Log options:
  --verbosity=N      verbosity level {5 - debug, 0 - only critical messages} [3]

  --percentile=N      percentile rank of query response times to count [95]

Compiled-in tests:
  fileio - File I/O test   磁盘IO
  cpu - CPU performance test   CPU 
  memory - Memory functions speed test  内存分配及速度
  threads - Threads subsystem performance test  多线程性能
  mutex - Mutex performance test   调度程序性能

还有具体的项的帮助,如下,具体的自行查看。

sysbench --test=fileio help
sysbench --test=cup help
sysbench  --test=memory help
sysbench  --test=threads help
sysbench  --test=mutex help 
sysbench --test=oltp help

测试实例

1. 磁盘测试

创建初始化fileio文件
sysbench --test=fileio --file-num=16 --file-total-size=2G prepare
开始测试

接下来开始对这些文件进行测试,使用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

随机读写每秒2.3817Mb IOPS 每秒152.43 说明很糟糕。

仿真环境的数据如下

好了不少,但还是比较慢的。

测试完成之后记得删除测试文件。
sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup

如果需要测试seqwr(顺序写), seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)等6种模式,并且还可能需要测试不同的线程和不同的文件块下磁盘的性能表现,这时,可以使用如下脚本达到测试目的。

#!/bin/bash
 
for size in {8G,64G}
do
for mode in {seqwr,seqrewr,seqrd,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 PARAS $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=100000 --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-mo
de-$mode-threads-$threads-blksz-$blksize 2>&1
done
done
sysbench --test=fileio --file-total-size=$size cleanup
done
done
done

内存测试

sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run

![](media/14879298422832/14881811382311.jpg)

内存差距一般不大,测试io意义更大些。

3.对MySQL事务型OLTP的测试 以这个为例,其它的换对应的lua脚本即可。

对于mysql的OLTP测试,和file一样,同样需要经历prepare,run,cleanup三个阶段。prepare阶段会在数据库中产生一张指定行数的表,默认表在sbtest架构下,表名为
sbtest(sysbench默认生成表的存储引擎为innodb),如创建一张8000万条记录的表:

常用参数简单说明:      
   --report-interval=10:每隔多久打印一次统计信息,单位秒,0.5版本新增  
   --rand-init=on:是否随机初始化数据,如果不随机化那么初始好的数据每行内容除了主键不同外其他完全相同。  
   --rand-type=special:数据分布模式,special表示存在热点数据,uniform表示非热点数据模式
   --mysql-table-engine=xxx:表的存储引擎类型,innodb、myisam、tokudb这些都可以
prepare准备阶段

初始化

sysbench --test=/usr/share/doc/sysbench/tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=100000 --db-driver=mysql --mysql-socket=/home/xiaohe/mysql-3306/mysql.sock  --num-threads=16 --mysql-table-engine=InnoDB  --rand-init=on   --mysql-db=test prepare
run运行测试

压力测试

sysbench --test=/usr/share/doc/sysbench/tests/db/oltp.lua  --oltp_tables_count=10 --oltp-table-size=100000 --oltp-dist-type=uniform   --report-interval=10 --rand-init=on  --mysql-table-engine=InnoDB  --mysql-db=test --max-time=3600 --max-requests=0 --num-threads=16 --thread-stack-size=256 --mysql-socket=/home/xiaohe/mysql-3306/mysql.sock  run > result.log

参数说明:
--max-time=3600 指定测试时长为1小时
--mysql-db=test 指定测试的数据库名

清理
sysbench --test=/usr/share/doc/sysbench/tests/db/oltp.lua  --oltp_tables_count=10 --oltp-table-size=100000 --db-driver=mysql --mysql-socket=/home/xiaohe/mysql-3306/mysql.sock  --mysql-table-engine=InnoDB --mysql-db=test cleanup