使用sysbench对MySQL进行压力测试
1.背景
出自percona公司,是一款多线程系统压测工具,可以根据影响数据库服务器性能的各种因素来评估系统的性能。例如,可以用来测试文件IO,操作系统调度器,内存分配和传输速度,POSIX线程以及数据库服务器等。sysbench支持Lua脚本语言,Lua对各种测试场景的设置可以非常灵活。sysbench支持MySQL,操作系统和硬件的测试。
2.安装与使用
安装:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
使用:
数据准备
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/mysql/lib/
. ~/.bash_profile
# 需要启用DEBUG模式时将下面三行注释去掉即可
#set -u
#set -x
#set -e
BASEDIR="/data/sysbench" #创建sysbench文件目录
if [ ! -d $BASEDIR ]
then
mkdir $BASEDIR -p
fi
cd $BASEDIR #进入sysbench文件目录
# 记录所有错误及标准输出到 sysbench.log 中
#exec 3>&1 4>&2 1>> sysbench_prepare.log 2>&1
DBIP=192.168.1.109
DBPORT=3109
DBUSER='proxysql'
DBPASSWD='123456'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
TBLCNT=10 #表数量
WARMUP=300 #预热时间(秒)
DURING=1800 #持续时间(秒)
ROWS=10000000 #每个表中插入1KW行数据
MAXREQ=1000000 #最大请求数为100W
#当达到持续时间或者最大请求数时,这一轮的测试就会停止
#创建sysbench专用的数据库
echo 'now create db'
mysql -h$DBIP -P$DBPORT -u$DBUSER -p$DBPASSWD -e 'create database sysbench'
echo 'create ok'
## 数据准备
echo 'now prepare data'
sysbench /usr/share/sysbench/oltp_read_only.lua \ #必须附加lua脚本才可以初始化数据
--mysql-host=$DBIP \
--mysql-port=$DBPORT \
--mysql-user=$DBUSER \
--mysql-password=$DBPASSWD \
--mysql-db=$DBNAME \
--db-driver=mysql \
--tables=10 \
--table-size=$ROWS \
--time=$DURING prepare
压测开始
#!/bin/bash
##
##
## 叶金荣, 知数堂培训联合创始人, 资深MySQL专家, MySQL布道师, Oracle MySQL ACE
##
## 几个注意事项:
## 1、运行sysbench的客户机和MySQL DB服务器尽量不要在同一台主机上,也包括一台宿主机上启动两个虚机的情形;
## 2、测试表的数量不宜太少,至少要求20个表以上;
## 3、每个表的数据量不宜太少,通常至少要求1千万以上,当然了,也要根据DB服务器的配置适当调整;
## 4、每次进行基准压测的时长不宜过短,通常要求持续15分钟以上;
## 5、每轮测试完毕后,中间至少暂停5分钟,或者确认系统负载完全恢复空跑状态为止;
## 6、测试DB服务器要是专用的,不能和其他业务混跑,否则测试结果就不靠谱了;
## 7、其余未尽事宜,后续再行补充。
##
## created by yejinrong@zhishutang.com
## 2017/6/3
##
## sysbench项目地址: https://github.com/akopytov/sysbench
##
####################### 2018/02/23 张锐志 ####################################
###叶老师原脚本仅适用于sysbench 0.5版本,sysbench升级到1.0后无法使用,现修改部分语法。
export LD_LIBRARY_PATH=/usr/local/mysql/lib/
. ~/.bash_profile
# 需要启用DEBUG模式时将下面三行注释去掉即可
#set -u
#set -x
#set -e
BASEDIR="/data/sysbench"
if [ ! -d $BASEDIR ]
then
mkdir $BASEDIR -p
fi
cd $BASEDIR
#清理之前的遗留记录
rm -rf $BASEDIR/logs*
# 记录所有错误及标准输出到 sysbench.log 中
exec 3>&1 4>&2 1>> sysbench.log 2>&1
#时间单位秒
DBIP=192.168.1.109
DBPORT=3109
DBUSER='proxysql'
DBPASSWD='123456'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
REPORT_INTERVAL=1
TBLCNT=10 #表数量
WARMUP=300 #预热时间(秒)
DURING=1800 #持续时间(秒)
ROWS=10000000 #每个表中插入1KW行数据
MAXREQ=1000000 #最大请求数为100W
#当达到持续时间或者最大请求数时,这一轮的测试就会停止
# 并发压测的线程数,根据机器配置实际情况进行调整
THERAD_NUMBER="8 64 128"
#初始次数
round=0
# 一般至少跑3轮测试,我正常都会跑10轮以上
while [ $round -lt 4 ]
do
#每回合日志位置:
rounddir=$BASEDIR/logs-round${round}
mkdir -p ${rounddir}
for thread in `echo "${THERAD_NUMBER}"`
do
#常用可选项:
#oltp_read_only #只读
#oltp_read_write #读写兼有
#oltp_update_non_index #无主键更新情形
sysbench /usr/share/sysbench/oltp_read_only.lua \
--mysql-host=$DBIP \
--mysql-port=$DBPORT \
--mysql-user=$DBUSER \
--mysql-password=$DBPASSWD \
--mysql-db=$DBNAME \
--db-driver=mysql \
--tables=$TBLCNT \
--table-size=$ROWS \
--report-interval=$REPORT_INTERVAL \
--threads=${thread} \
--rand-type=uniform \ #数据随机类型:uniform,均匀的
--time=$DURING run >> ${rounddir}/sysbench_${thread}.log
sleep 300 #不同的线程数压测之间停顿5分钟
done
round=`expr $round + 1`
sleep 300 #每轮压测之间停顿5分钟
done
运行完毕后在预设的数据目录下可以找到sysbench输出的日志。
3.结果分析与绘图
可以直接阅读sysbench日志给出的总结,也可以对其中个别项的数据进行绘图观察趋势。
SQL statistics:
queries performed:
read: 142870
write: 0
other: 20410
total: 163280
transactions: 10205 (5.66 per sec.)
queries: 163280 (90.53 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 1803.6625s
total number of events: 10205
Latency (ms):
min: 3113.18
avg: 11303.55
max: 24222.47
95th percentile: 16819.24
sum: 115352747.29
Threads fairness:
events (avg/stddev): 159.4531/1.51
execution time (avg/stddev): 1802.3867/1.03
#我使用的是硬件资源十分有限的虚拟机,压测结果有点扎心。
安装gnuplot进行绘图,gnuplot需要图形环境,可以选择在windows上安装,也可以在施压客户机上安装图形界面。这里选择在linux施压客户机上安装图形界面。
dnf -y install @xfce-desktop #安装图形界面
yum -y install gnuplot #安装gnuplot
gnuplot #进入gnuplot终端
gnuplot>plot 'output/sysbench_8.log' using 9 w lines title 'QPS'
#using 5 表示使用第5列数据作图
#with lines 定义图中的趋势使用线来表示
#title 'QPS' 定义线的名称
#使用,(逗号)分割,进行多列数据的绘制
图形如下:只读压测QPS图形

通过其他脚本观察sysbench压测过程中的系统信息和数据库信息(来源于《高可用 MySQL》)
#!/bin/sh
#开始前获取全局配置参数
#每五秒获取一次cpu load,MySQL全局信息,InnoDB引擎相关信息,线程信息
INTERVAL=5
PREFIX=$INTERVAL-sec-status
RUNFILE=/root/running
mysql -e 'show global variables'>>mysql-variables
#通过检测 /root/running文件是否存在作为是否进行获取信息的依据,可以在压测结束时删除此文件停止收集
while test -e $RUNFILE; do
file=$(date +%F_%H)
sleep=$(date +%s.%N |awk "{print $INTERVAL -(\$1 % $INTERVAL)}")
sleep $sleep
ts="$(date +"TS %s.%N %F %T")"
loadavg="$(uptime)" #通过uptime命令获取cpu load
echo "$ts $loadavg">> $PREFIX-${file}-status
mysql -e "show global status" >> $PREFIX-${file}-status & #获取MySQL全局信息
echo "$ts $loadavg">> $PREFIX-${file}-innodbstatus
mysql -e "show engine innodb status\G" >> $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 not exist
对上一步收集到的全局信息进行分析。
#!/bin/sh
awk '
BEGIN{
printf "#ts date time load QPS";
fmt = " %.2f";
}
/^TS/ { # The timestamp lines begin with TS.
ts = substr($2, 1, index($2,".") - 1);
load = NF - 2;
diff = ts -prev_ts;
prev_ts = ts;
printf "\n%s %s %s %s",ts,$3,$4,substr($load, 1, length($load)-1);
}
/Queries/ {
printf fmt, ($2-Queries)/diff;
Queries=$2
}
' "$@"
运行方式:sh hi_anaylyze.sh 5-sec-status-2018-02-22_14_status >>4plot.log (将分析后的结果记入4plot.log中)
同样使用gnupot进行绘图分析:
gunplot>plot '4plot' using 5 with lines title 'QPS', 4 with lines title 'load'
#using 5 表示使用第5列数据作图
#with lines 定义图中的趋势使用线来表示
#title 'QPS' 定义线的名称
#使用,(逗号)分割,进行多列数据的绘制
gnuplot绘图示例

(两个图形的数据来源不同,仅作为示例使用。)
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-02/151053.htm
使用sysbench对MySQL进行压力测试的更多相关文章
- 使用 sysbench对mysql进行压力测试介绍之一
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL.本文只是简单演示一下几种测试的用 ...
- mysql+mycat压力测试一例【转】
前言 有很多人担心生产系统上新东西的程序怕压力跟不上和稳定性不行,是的,大家都怕,所以领导要求做一次压力测试,我个人也觉得是有必要的. 如果按原理来说,mycat如果不做分片,纯粹只是代理的话,他所做 ...
- python mysql数据库压力测试
python mysql数据库压力测试 pymysql 的执行时间对比 1,装饰器,计算插入1000条数据需要的时间 def timer(func): def decor(*args): start_ ...
- 使用sysbench 进行msyql oltp压力测试
安装参考: https://github.com/akopytov/sysbench#linux#参数说明 需要说明的选项: mysql-db=dbtest1a:测试使用的目标数据库,这个库名要事先创 ...
- mysqlslap 一个MySQL数据库压力测试工具
在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...
- 用mysqlslap对MySQL进行压力测试
MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理.现在看一下这个压力测试工具mysqlslap.关于他的选项手册上以及--help介绍的很详细.我解释一下一些常用的选项.这里要 ...
- mysql之 mysql数据库压力测试工具(mysqlslap)
mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具.通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个存 ...
- mysqlslap对mysql进行压力测试
mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具.通过模拟多个并发客户端访问MySQL来执行压力测试,并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别. mysq ...
- 使用JMeter进行MySQL的压力测试
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 前言 1. JMeter安装 2. 导入MyS ...
随机推荐
- 【Python基础】01_Python中的变量
1.定义和运算: 变量名 = 值 定义变量举例: # 定义一个变量 myCar = "比亚迪F0" # 输出一个变量 print(myCar) 变量之间的简单运算举例: price ...
- const关键字的使用——C语言
一.常规用法 关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以.所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它 ...
- UPUPW Apache5.5系列本地开发环境配置
UPUPW Apache5.5系列 1. 在官网下载 Apache5.5系列,选择云端下载. 官网地址: http://www.upupw.net/aphp55/n110.html 2. 下载后,将压 ...
- 第一个vue程序:hello,vlue
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- (三)CXF之处理输入参数与输出类型为复杂类型的webService服务
一.需求 调用webService服务,把用户名和密码封装为用户对象作为参数,返回该用户所用友的角色列表. 二.发布服务 2.1 编写服务接口 @WebService public interface ...
- MySQL存储的字段是不区分大小写的,你知道吗?
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 00 简单回顾 之前写过一篇关于mysql 对表大小写敏感的问题,其实在mysql中字段存储的内容是不区分大小写的,本篇进 ...
- PL/SQL Developer的错误提示弹框的文本显示乱码问题
问题:Windows中文环境下,PL/SQL Developer的错误提示弹框文本为乱码,如下: 解决过程:1.使用SELECT * FROM v$nls_parameters;查询得知服务器的字符集 ...
- es6中Array.from()
Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组. 那么什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有length属性的对象. 1.将类数组对象转换为真正数 ...
- 关于WEB前端开发的思考与感悟
万事开头难. 当我想要认真写一篇文章向大家分享我对前端的认识与感悟的时候,突然就深刻的体会到了这句话确实太有道理了. 最近几年对于web前端的传闻很多,比如人才稀缺,简单易学,待遇丰厚,整体势头发展良 ...
- YII2 实现dropDownList 联动事件
一.视图中 <div class="main-form"> <?php $form = ActiveForm::begin(); ?> <?= $fo ...