MySQL 常用的基准测试工具介绍 mysqlslap、sysbench

SuKiWX | | 访问(85)

  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