首页 > 数据库 > MySQL >

使用mydbtest进行mysql压测

2017-03-29

mydbtest是一款轻量级的mysql数据库压测工具,由OneProxy创始人楼方鑫编写,mydbtest相较于sysbench压测工具,功能单一,但是安装部署操作简单,只需要简单的配置,就可以进行压测,非常方便。

mydbtest简介

mydbtest是一款轻量级的mysql数据库压测工具,由OneProxy创始人楼方鑫编写,mydbtest相较于sysbench压测工具,功能单一,但是安装部署操作简单,只需要简单的配置,就可以进行压测,非常方便。

mydbtest主要运行在linux上,64位下载地址 : mydbtest_linux64.bin

安装部署

免安装,直接解压可用。需要注意的是,压测机器上面必须装有mysql客户端工具,即确保能正常运行mysql命令。

配置

配置文件包含以下几块内容:

option : 控制选项 declare : 声明变量,可以用到压测SQL中,组成动态的SQL begin … end : 在begin和end中间编写压测过程中使用的SQL语句

option

主要包含以下选项的配置:

name

指定压测用例名,只体现在测试报告里面,对压测没有任何实际影响

user

数据库连接信息,格式为 user/password@hostname:ip:database

loop

控制测试执行次数,默认为1亿次,压测通常控制压测时间(time配置选项),这个参数并不常用。

wait

两次执行(所有定义的语句被执行算一次)之间的暂停时间,单位为 0.1 毫秒,不是指两个 SQL 语句之间的暂停时间。默认值为 0 表示没有任何停顿,用大并发测试时需要指定一个暂停时间,若未定义则在超过 1000 个并发线程压测时会计算一个默认值。

log

输出日志文件名,默认输出到屏幕。如果不想输出任何信息,可以定义为/dev/null

time

指定测试时间,默认值为3600,即1个小时。默认单位为s,也可以指定m或者h来代表分钟和小时,eg : 5m表示5分钟,1h表示1小时。注意,此参数与loop参数互斥,不可同时配置。

show

报告时间间隔,每隔多少秒输出统计报告。默认值为300,即5分钟。

tran

事务模式开关,默认值为OFF,表示运行在自动提交模式,每一个SQL会被当作一个事务,执行成功则提交;如果设置为ON,则第一条SQL执行之前会有一个开启事务的调用,所有SQL执行完成后,会有一个事务提交命令。

commit

事务大小参数,默认值为1,表示每执行1次测试发1次提交命令,此参数只在事务模式下有效,即tran参数应该配置为ON

declare

定义测试过程中用的变量,在测试SQL中可以使用这些变量。mydbtest会根据变量类型,生成随机数值,从而实现SQL的随机。

declare定义变量的格式如下所示:

变量名 变量类型 最小值 最大值
or
变量名 变量类型 值列表

变量类型有如下几类:

seq

自增的32位整数,从最小值递增到最大值,超过最大值则从最小值从头开始循环使用。eg:

vid1 seq 1 10000
vid2 seq 1 20000
int

32位的随机整数,随机范围在最小值和最大值之间。eg:

vid int 10000 20000

上述定义表示vid取值在10000到20000之间。注意,随机生成的值可能重复。

intlist

从给定的值里面随机选择一个整数,多个数值用逗号隔开。eg:

vid intlist 1,2,3,4,5
char

字符串类型,需要定义最小长度和最大长度,字符串长度将在最小长度和最大长度之间随机。如果想生成定长的字符串,那么请将最小长度和最大长度设定为一样的长度。eg:

vchar1 char 10 20
vchar2 char 10 10
strlist

从给定的字符串列表中随机选取一个字符串。多个字符串之间用逗号隔开。限制字符串的值不能包含空格,两个字符串之间不能带空格。eg:

vstr strlist a,aa,aaa
float and double

低精度浮点数 和 高精度浮点数,取值在最小值和最大值之间。eg:

v_float 1 10000
v_double 1 10000
date

自动生成的具有日期格式YYYY-MM-DD的字符串,需要指定日期范围,开始日期为当前日期减最小值,结束日期为当前日期加最大值。例如指定值“-10”表示开始日期为10天前,指定”10”表示10天后。eg:

V_date1 date -10 10
V_date2 date -30 30
timestamp

自动生成的具有日期格式YYYY-MM-DD HH24:MI:SS的字符串,需要指定日期范围,开始日期为当前日期减最小值,结束日期为当前日期加最大值。例如指定值“-10”表示开始日期为10天前,指定”10”表示10天后。eg:

V_datetime1 timestamp -10 10
V_datetime2 timestamp -10 10

SQL

在begin和end之间编写你要压测的sql,在sql中可以使用在 ”declare” 块声明的变量,变量的引用方式为如下所示,eg:

declare
vid int 1 10000
begin
select * from t1 where id = :vid;
end

完整示例配置

一个完整的配置文件示例:

option
  user mydbtest/mydbtest@10.202.7.88:3306:test
  log /dev/null
  time 2m
declare
  vid seq 10000000 20000000
  vk int 10 10000000
  vc char 800 800
  vpad char 200 200
begin
 insert into mydbtest(id,k,c,pad) values (:vid,:vk,:vc,:vpad);
end

运行

执行以下命令运行压测:

./mydbtest_linux64.bin query=query.cnf degree=32

参数说明:

query : 指定具体的配置文件 degree : 指定压测并发度(压测线程个数)

结果解读

测试报告如下所示:

Summary: SQL01 exec=813469, rows=813469=100/e, avg=4741 us
Summary: exec=6667/s, qtps=6667/s

主要关注:

qtps : 当测试SQL为写操作的时候,为TPS,当测试SQL为读操作的时候,表示QPS,若混合读写,则需要根据读写比例计算TPS和QPS。 avg : 表示95%平均响应时间,单位为微秒

FAQs

如何提前终止压测,得到测试结果?

有时候并不想压测那么长的时间,那么可以按住ctrl+c退出程序的执行,同时可以得到测试结果

ctrl+c无法退出,hange住了该怎么办?

当degree设置得特别大的时候,按ctrl+c退出程序,有可能无法退出,直接hange住,这时候已经不能得到测试结果了,只能够找到对应的进程,强行kill掉

ps aux | grep mydbtest
kill -9 ${pid}

相关文章
最新文章
热点推荐