Mysql基准测试工具之mysqlslap
mysql5.1版本后自带的基准测试工具,随Mysql一起安装
特点:
可以模拟服务器负载,并输出相关统计信息
可以指定也可以自动生成查询语句
Mysql基准测试工具之sysbench
sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库;主要包括以下几种测试:
cpu性能
磁盘io性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
本文主要介绍对数据库性能的测试。
sysbench安装
1、源安装
源代码:https://github.com/akopytov/sysbench
CentOS 如果有sysbench源,直接安装即可
yum -y install sysbench
2、下载安装
(1)下载解压
wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip" unzip sysbench-1.0.zip cd sysbench-1.0
(2)安装依赖
yum install automake libtool –y
(3)安装
安装之前,确保位于之前解压的sysbench目录中。
./autogen.sh ./configure export LD_LIBRARY_PATH=/usr/local/mysql/include #这里换成机器中mysql路径下的include make make install
安装成功,查看版本
sysbench --version
sysbench支持三种测试方案:
1、使用自带的测试模块,如对cpu,I/O,memory等的测试。
2、使用自带的lua脚本进行测试,如果使用快速安装的方式,默认的脚本路径为:/usr/share/sysbench
3、使用自定义的lua脚本。
获取帮助信息:
如果对相关模块或者脚本的参数不明确的,可以使用 sysbench testname help来查看,testname含模块名称和脚本名称。sysbench经典测试命令:
prepare: 创建测试数据或者相关的测试文件,为测试做准备工作。如数据库的测试数据准备等。
run: 开始执行测试。
cleanup: 移除测试数据
help: 帮助命令
开始测试
编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
1、cpu性能测试
sysbench --test=cpu --cpu-max-prime=20000 run
cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。
2、线程测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
3、磁盘IO性能测试
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup
上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。
4、内存测试
sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。
5、OLTP基准测试
OLTP基准测试模拟了一个简单的事务处理系统的工作负载。若要对数据库性能进行测试就要使用OLTP相关的脚本。
在/usr/share/sysbench/目录下有相关的lua脚本:
bulk_insert.lua oltp_common.lua oltp_delete.lua oltp_insert.lua oltp_point_select.lua oltp_read_only.lua oltp_read_write.lua oltp_update_index.lua oltp_update_non_index.lua oltp_write_only.lua select_random_points.lua select_random_ranges.lua # 对于未知的测试参数,可以通过 sysbench scripts-name help 来查看。 # 例如:sysbench oltp_common help # 创建测试数据: sysbench oltp_common --table-size=1000000 --db-driver=mysql --mysql-db=sbtest --mysql-user=root --mysql-password=123456 prepare # 执行run命令进行测试:(只读)性能 sysbench oltp_read_only --table-size=1000000 --db-driver=mysql --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --time=60 --max-requests=0 --threads=8 run # 执行run命令进行测试:(写)性能 sysbench oltp_write_only --table-size=1000000 --db-driver=mysql --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --time=60 --max-requests=0 --threads=8 run # 清理测试数据: sysbench oltp_read_only --table-size=1000000 --db-driver=mysql --mysql-db=sbtest --mysql-user=root --mysql-password=123456 cleanup
上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。--mysql-table-engine 还可以指定为 innodb 等 MySQL 支持的表存储引擎类型。
# 文件 analyze.sh #!/bin/bash awk ' BEGIN { printf "#ts date time load QPS"; fmt=" %.2f"; } /^TS/ { ts = substr($2,1,index($2,".")-1); load = NF -2; diff = ts - prev_ts; printf "\n%s %s %s %s",ts,$3,$4,substr($load,1,length($load)-1); prev_ts=ts; } /Queries/{ printf fmt,($2-Queries)/diff; Queries=$2 } ' "$@" # 文件 Get_Test_info.sh #!/bin/bash INTERVAL=5 PREFIX=/home/imooc/benchmarks/$INTERVAL-sec-status RUNFILE=/home/imooc/benchmarks/running echo "1" > $RUNFILE MYSQL=/usr/local/mysql/bin/mysql $MYSQL -e "show global variables" >> mysql-variables while test -e $RUNFILE; do file=$(date +%F_%I) sleep=$(date +%s.%N | awk '{print 5 - ($1 % 5)}') sleep $sleep ts="$(date +"TS %s.%N %F %T")" loadavg="$(uptime)" echo "$ts $loadavg" >> $PREFIX-${file}-status $MYSQL -e "show global status" >> $PREFIX-${file}-status & echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus $MYSQL -e "show engine innodb status" >> $PREFIX-${file}-innodbstatus & echo "$ts $loadavg" >> $PREFIX-${file}-processlist $MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist & echo $ts done echo Exiting because $RUNFILE does not exists # 文件 split_test.sh #!/bin/bash order_id=2 while : do order_id=`echo $order_id+1| bc` sql="insert into order_detail(order_id,add_time,order_amount,user_name,user_tel) values(${order_id},now(),100,'wyjs','123456')"; echo $sql | mysql -utest -p123456 -P3307 -h10.103.9.101 sql2="insert into order_product(order_id,product_id) values(${order_id},${order_id})" echo $sql2 | mysql -utest -p123456 -P3307 -h10.103.9.101 sql3="insert into category(id,name) values(${order_id},'wyjs')" echo $sql3 | mysql -utest -p123456 -P3307 -h10.103.9.101 done