sysbench是基于LuaJIT的可编写脚本的多线程基准测试工具。它最常用于数据库基准测试,但也可用于创建不涉及数据库服务器的任意复杂的工作负载。(本次我们只讨论对应Mysql的压力测试内容,对于它支持的postgresql不讨论)
写在前面
本文来自知数堂 https://github.com/zhishutech/mysqldba
link
官方链接https://github.com/akopytov/sysbench
link
详细内容请阅读原文文档
https://github.com/akopytov/sysbench(下载安装包1.0.20)
./autogen.sh
# Add --with-pgsql to build with PostgreSQL support
./configure
make -j
make install
1.下载https://github.com/zhishutech/mysqldba/tree/master/mysql-benchmark
2.本次使用到的文件名为sysbench10_prepare.sh(准备数据),之后包含预热数据:prewarm 修改上面脚本(把prepare改为prewarm)
sysbench05-oltp.sh(运行压测)
sysbench10_cleanup.sh(清理数据),笔者更改sysbench10_prepare.sh文件得来的
Mysql5.7.26主从
sysbench1.0.20
测试用表10张,单张100W行,默认算法
其他参数见sysbench官网
需要读者该更的行数及内容
24 export LD_LIBRARY_PATH=/usr/local/sandboxes/mysql_base/5.7.26/lib/
33 BASEDIR="/tools/testsysbench"
66 while [ $round -lt 11 ]
find / -name oltp_read_only.lua (查找脚本内容)
79 sysbench /tools/sysbench-1.0.20/src/lua/oltp_read_write.lua \
本次只测试了oltp_read_write.lua(读写)脚本的内容,对于只读,只写,update脚本读者可以按照下面的内容分批独立测试
1.准备数据:/bin/bash sysbench10_prepare.sh
/tools/testpy/mysqldba-master/mysql-benchmark/sysbench10_prepare.sh
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/sandboxes/mysql_base/5.7.26/lib/
. ~/.bash_profile
# 需要启用DEBUG模式时将下面三行注释去掉即可
#set -u
#set -x
#set -e
BASEDIR="/tools/testsysbench"
if [ ! -d $BASEDIR ]
then
mkdir $BASEDIR -p
fi
cd $BASEDIR
# 记录所有错误及标准输出到 sysbench.log 中
#exec 3>&1 4>&2 1>> sysbench_prepare.log 2>&1
DBIP=192.168.66.133
DBPORT=17261
DBUSER='msandbox'
DBPASSWD='123456'
SOCKET='/tmp/mysql_sandbox17261.sock'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
TBLCNT=10
ROWS=1000000
DURING=180
#create db
echo 'now create db'
mysql -h$DBIP -P$DBPORT -u$DBUSER -p$DBPASSWD -e 'create database sysbench'
echo 'create ok'
## prepare data
echo 'now prepare data'
sysbench /tools/sysbench-1.0.20/src/lua/oltp_read_write.lua \
--mysql-host=$DBIP \
--mysql-port=$DBPORT \
--mysql-user=$DBUSER \
--mysql-password=$DBPASSWD \
--mysql-db=$DBNAME \
--db-driver=mysql \
--tables=$TBLCNT \
--table-size=$ROWS \
--time=$DURING prepare
#预热数据时,prepare改为prewarm
2.预热数据:/bin/bash sysbench10_prewarm.sh (把上面的脚本prepare改为prewarm)
3.运行压测: /bin/bash sysbench05-oltp.sh
#!/bin/bash
export LD_LIBRARY_PATH=/usr/local/sandboxes/mysql_base/5.7.26/lib/
. ~/.bash_profile
# 需要启用DEBUG模式时将下面三行注释去掉即可
#set -u
#set -x
#set -e
BASEDIR="/tools/testsysbench"
cd $BASEDIR
# 记录所有错误及标准输出到 sysbench.log 中
exec 3>&1 4>&2 1>> sysbench.log 2>&1
DBIP=192.168.66.133
DBPORT=17261
DBUSER='msandbox'
DBPASSWD='123456'
SOCKET='/tmp/mysql_sandbox17261.sock'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
TBLCNT=10
WARMUP=300
DURING=900
ROWS=1000000
MAXREQ=20000000
# 并发压测的线程数,根据机器配置实际情况进行调整
RUN_NUMBER="8 64 128 256 512 768 1024 1664 2048 4096"
## prepare data
## sysbench --mysql-host=x --mysql-port=x --mysql-user=x --mysql-password=x --mysql-db=x --oltp_tables
_count=50 \
## --oltp-table-size=20000000 prepare
round=1
# 一般至少跑3轮测试,我正常都会跑10轮以上
while [ $round -lt 4 ]
do
#每回合日志位置:
rounddir=$BASEDIR/logs-round${round}
mkdir -p ${rounddir}
for thread in `echo "${RUN_NUMBER}"`
do
sysbench /tools/sysbench-1.0.20/src/lua/oltp_read_write.lua --db-driver=mysql --mysql-host=${DBIP} --
mysql-port=${DBPORT} \
--mysql-user=${DBUSER} --mysql-password=${DBPASSWD} --mysql-db=${DBNAME} --tables=${TBLCNT} \
--table-size=${ROWS} --threads=${thread} --report-interval=1 \
--rand-type=uniform --max-time=${DURING} --max-requests=0 --percentile=99 run >> ${rounddir}/sysbench_
${thread}.log
sleep 300
done
round=`expr $round + 1`
sleep 300
done
4.清理数据:/bin/bash sysbench10_cleanup.sh
在执行压测时,tailf Mysql错误日志 tailf msandbox.err(根据报错发现数据问题)
运行压测时后,会在脚本中指定的目录/tools/testsysbench中生成压测结果,我们可以根据内容进行图表或是手动分析
参数的解释:
--threads=4500 表示发起4500个并发连接
--oltp-read-only=off 表示不要进行只读测试,也就是会采用读写混合模式测试
--report-interval=10 表示每10秒输出一次测试进度报告
--rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)
--time=120 表示最大执行时长为 120秒
--max-requests=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
--tables=10 表示10个表
--table-size=100000 单表100000条记录
--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值
SQL statistics:
queries performed:
read: 0 读操作
write: 233015 --写总数
other: 197026 --其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
total: 430041 --全部总数
transactions: 62617 (486.84 per sec.) --总事务数(每秒事务数)
queries: 430041 (3343.55 per sec.) --查询数(每秒查询数)
ignored errors: 27087 (210.60 per sec.) --忽略错误数
reconnects: 0 (0.00 per sec.) --重新连接次数
General statistics:
total time: 128.6147s --运行总时间
total number of events: 62617 --事件总数
Latency (ms):
min: 2.09
avg: 8957.64
max: 99069.80
95th percentile: 27846.48
sum: 560900840.54
Threads fairness: #线程平均数
events (avg/stddev): 13.9149/3.92
execution time (avg/stddev): 124.6446/2.39
可以根据/usr/share/sysbench下面的lua脚本进行读、写、更新,随机等等测试,条件允许建议时间1小时以上,以便测试数据准确·
写在最后
方便读者只是临时想测试一次,下面是单独的测试语句
1.数据准备
sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=xxxxxx --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 prepare
2.运行测试
sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=hongsinCS --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 run
3.清理数据:
sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=hongsinCS --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 cleanup
sysbench0.5版本和1.0版本参数不一样,其他没有想到的内容,欢迎一起讨论
本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删