这个周末非常地无聊,下载了最新版的sysbench,发现已经被改得面目全非。熟悉的编译选项、运行参数都跑不通了,最坑爹的是有些版本还要自己到处找lua脚本。从产品经理的角度,我要给所有新版本的sysbench打负分!果然小的开源项目都是作者爽完的卫生纸。尝试了好几个版本之后,终于找到一个按部就班就能用的。在这分享给大家,节省点时间就是送钱。
我比较熟悉Linux,以下教程是基于CentOS的:首先,安装一些必要的系统工具
sudo su - root
yum install autoconf automake make libtool* unzip mysql mysql-devel -y其次,下载和编译安装sysbench
wget https://github.com/akopytov/sysbench/archive/0.5.zip
unzip 0.5.zip
cd sysbench-0.5
./autogen.sh
./configure
make -j8
make install再其次,初始化MySQL测试环境mysql -hXXXX -P3306 -uXXXX -pXXXX
>drop database sbtest;
>create database sbtest;
>exit;
sysbench --num-threads=32 --max-time=60 --max-requests=999999999 --oltp-table-size=1000000 --oltp-tables-count=16 --db-driver=mysql --mysql-table-engine=innodb --test=/root/sysbench-0.5/sysbench/tests/db/oltp.lua --mysql-host=XXXX --mysql-port=3306 --mysql-user=XXXX --mysql-password=XXXX prepare 2>&1 > sysbench.log &最后,愉快地压测MySQLsysbench --num-threads=32 --max-time=60 --max-requests=999999999 --oltp-table-size=1000000 --oltp-tables-count=16 --db-driver=mysql --mysql-table-engine=innodb --test=/root/sysbench-0.5/sysbench/tests/db/oltp.lua --mysql-host=XXXX --mysql-port=3306 --mysql-user=XXXX --mysql-password=XXXX run
上面这个sysbench测试将会在MySQL的sbtest库里面创建16个innodb表(sbtest是sysbench test的缩写,作者跟中国DBA没仇),每个表的数据量是100万,总共1600万数据。这个数据量非常小,MySQL的innodb buffer pool有几个GB基本就可以cache住大部分数据,所以比较适合压测CPU。如果想要测试IO性能,可以在初始化阶段加大oltp-table-size和oltp-tables-count,让OLTP测试的目标数据尽可能不被cache。
如果运行顺利的话,完事之后会得到如下结果:
OLTP
test statistics:
queries performed:
read: 1093092
write: 312312
other: 156156
total: 1561560
transactions: 78078 (1300.79 per sec.)
read/write requests: 1405404 (23414.22
per sec.)
other operations: 156156 (2601.58 per
sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.0235s
total number of events: 78078
total time taken by event
execution: 1920.2594s
response time:
min: 19.56ms
avg: 24.59ms
max: 308.74ms
approx. 95 percentile: 31.44ms
Threads fairness:
events (avg/stddev): 2439.9375/36.86
execution time (avg/stddev): 60.0081/0.01
如果关注吞吐量,看read/write requests;如果关注响应时间,看response time。在response time一定的情况下,通过增加客户端的线程数可以提升MySQL吞吐量。
注意,线程数不能比MySQL的CPU数量多太多!否则MySQL将会消耗更多CPU在资源争抢上,吞吐量反而会下降。上面测试用了32个客户端线程,应该比较具有普适性。
手痒的同学们可以赶紧买几个云数据库玩玩了,我们下周再见。