mydbtest是一款轻量级的mysql数据库压测工具,由OneProxy创始人楼方鑫编写,mydbtest相较于sysbench压测工具,功能单一,但是安装部署操作简单,只需要简单的配置,就可以进行压测,非常方便。
mydbtest主要运行在linux上,64位下载地址 : mydbtest_linux64.bin
免安装,直接解压可用。需要注意的是,压测机器上面必须装有mysql客户端工具,即确保能正常运行mysql命令。
配置文件包含以下几块内容:
主要包含以下选项的配置:
指定压测用例名,只体现在测试报告里面,对压测没有任何实际影响
数据库连接信息,格式为 user/password@hostname:ip:database
控制测试执行次数,默认为1亿次,压测通常控制压测时间(time配置选项),这个参数并不常用。
两次执行(所有定义的语句被执行算一次)之间的暂停时间,单位为 0.1 毫秒,不是指两个 SQL 语句之间的暂停时间。默认值为 0 表示没有任何停顿,用大并发测试时需要指定一个暂停时间,若未定义则在超过 1000 个并发线程压测时会计算一个默认值。
输出日志文件名,默认输出到屏幕。如果不想输出任何信息,可以定义为/dev/null
指定测试时间,默认值为3600,即1个小时。默认单位为s,也可以指定m或者h来代表分钟和小时,eg : 5m表示5分钟,1h表示1小时。注意,此参数与loop参数互斥,不可同时配置。
报告时间间隔,每隔多少秒输出统计报告。默认值为300,即5分钟。
事务模式开关,默认值为OFF,表示运行在自动提交模式,每一个SQL会被当作一个事务,执行成功则提交;如果设置为ON,则第一条SQL执行之前会有一个开启事务的调用,所有SQL执行完成后,会有一个事务提交命令。
事务大小参数,默认值为1,表示每执行1次测试发1次提交命令,此参数只在事务模式下有效,即tran参数应该配置为ON
定义测试过程中用的变量,在测试SQL中可以使用这些变量。mydbtest会根据变量类型,生成随机数值,从而实现SQL的随机。
declare定义变量的格式如下所示:
变量名 变量类型 最小值 最大值
or
变量名 变量类型 值列表
变量类型有如下几类:
自增的32位整数,从最小值递增到最大值,超过最大值则从最小值从头开始循环使用。eg:
vid1 seq 1 10000
vid2 seq 1 20000
32位的随机整数,随机范围在最小值和最大值之间。eg:
vid int 10000 20000
上述定义表示vid取值在10000到20000之间。注意,随机生成的值可能重复。
从给定的值里面随机选择一个整数,多个数值用逗号隔开。eg:
vid intlist 1,2,3,4,5
字符串类型,需要定义最小长度和最大长度,字符串长度将在最小长度和最大长度之间随机。如果想生成定长的字符串,那么请将最小长度和最大长度设定为一样的长度。eg:
vchar1 char 10 20
vchar2 char 10 10
从给定的字符串列表中随机选取一个字符串。多个字符串之间用逗号隔开。限制字符串的值不能包含空格,两个字符串之间不能带空格。eg:
vstr strlist a,aa,aaa
低精度浮点数 和 高精度浮点数,取值在最小值和最大值之间。eg:
v_float 1 10000
v_double 1 10000
自动生成的具有日期格式YYYY-MM-DD
的字符串,需要指定日期范围,开始日期为当前日期减最小值,结束日期为当前日期加最大值。例如指定值“-10”表示开始日期为10天前,指定”10”表示10天后。eg:
V_date1 date -10 10
V_date2 date -30 30
自动生成的具有日期格式YYYY-MM-DD HH24:MI:SS
的字符串,需要指定日期范围,开始日期为当前日期减最小值,结束日期为当前日期加最大值。例如指定值“-10”表示开始日期为10天前,指定”10”表示10天后。eg:
V_datetime1 timestamp -10 10
V_datetime2 timestamp -10 10
在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
参数说明:
测试报告如下所示:
Summary: SQL01 exec=813469, rows=813469=100/e, avg=4741 us
Summary: exec=6667/s, qtps=6667/s
主要关注:
有时候并不想压测那么长的时间,那么可以按住ctrl+c
退出程序的执行,同时可以得到测试结果
ctrl+c
无法退出,hange住了该怎么办?当degree设置得特别大的时候,按ctrl+c
退出程序,有可能无法退出,直接hange住,这时候已经不能得到测试结果了,只能够找到对应的进程,强行kill掉
ps aux | grep mydbtest
kill -9 ${pid}