MySQL数据库自带基准压力测试工具MySQLSlap使用探索

MySQLSlap是MySQL自带的基准压力测试工具,用于模拟多客户端并发测试,提供性能数据并对比不同存储引擎。本文介绍了其常用参数,如自动生成数据库、多线程测试、迭代测试、自定义脚本测试等,还探讨了如何启用日志和调整并发数量。

一、介绍

mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,可以生成schema,装载数据,执行benckmark和查询数据,语法简单,灵活,容易使用。

该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。

mysqlslap通过模拟MySQL服务器的客户端负载,并报告每个阶段的时间,它的工作方式就好像多个客户端正在访问服务器一样。

mysqlslap为mysql性能优化前后提供了直观的验证依据,根据mysqlslap测试结果可以准确的掌握线上系统能够支撑的用户流量上限及其抗压性等问题。

MySQL官方指导文档中也存在对mysqlslap的详细描述(其实看官方文档可以避免很多弯路,值得推荐)

https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html

使用方式:

shell> mysqlslap [options]

二、常用参数

可以在官方文档或者使用 mysqlslap --help可以查看这些参数:

  • --auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。
  • --auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)。
  • --auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。
  • --number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
  • --number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
  • --number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
  • --query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
  • --create-schema 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database。
  • --commint=N 多少条DML后提交一次。
  • --compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
  • --concurrency=N, -c N 表示并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。例如:--concurrency=100,200,500。
  • --engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb。
  • --iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次。
  • --only-print 只打印测试语句而不实际执行。
  • --detach=N 执行N条语句后断开重连。
  • --debug-info, -T 打印内存和CPU的相关信息。

三、简单案例

1、单线程测试

mysqlslap -uroot -p123 -a --only print

-u:用户;-p:密码

由于我是自定义目录安装的,所以下面的截图中我在执行mysqlslap时是进入到安装目录的bin下通过 ./mysqlslap来执行,如果是按照默认方式安装的就不需要./

 mysqlslap使用 -a参数自动生成数据库、数据表以及数据

有时候我们想确认一下mysqlslap到底执行了哪些操作,那么使用 --only print参数可以查看mysqlslap到底执行了哪些操作:

 可以看到mysqlslap执行了大量的写操作(插入),并且测试结束之后mysqlslap会将自动生成的数据库数据表删除,所以运行完了之后是看不到这些数据库表的。

去掉 --only print就会真实执行:

2、多线程测试 

mysqlslap -uroot -p123 -a -c 100

-c参数或者--concurrency=可以指定并发数,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。

分别以50,100,150,200个并发执行:

但是要注意并发的个数,不是无限的比如我使用2000个并发,会遇到下面的问题:

Error when connecting to server: 1040 Too many connections

MySQL是有最大并发设置的,这个本文后面再讲。

3、迭代测试,多次执行测试得到平均值

mysqlslap  -uroot -p123 -a -i 100

-i 参数或者 --iterations=可以指定迭代次数:

4、测试次数设置

mysqlslap -uroot -p123 -a --number-of-queries 1000

 --number-of-queries 参数设置执行次数(不要被queries给迷惑住了,就把它当成次数就行)

这个就是把本节第1案例中--only print打印出来的内容执行1000次。

 5、同时测试不同的存储引擎进行性能对比

mysqlslap -uroot -p123 -a -c 50,100 --number-of-queries 1000 --i 5 --engine=myisam,innodb --debug-info

 --engine 参数或者 -e参数指定要对比性能的存储引擎

 6、自定义测试

在mysqlslap中存在 --query,-q参数用来使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。

(同样的,不要被--query给迷惑住了,不是只能进行查询工作)

教程都是这么说的但是没人介绍怎么做,要么有的就是简单的使用 --query = "sql语句" 来进行测试,在本文中准备通过以节的内容来描述怎么使用 --query、-q参数。

四、自定义脚本测试

(如果需要自定义测试,这一节需要仔细看~)

1、首先创建一个.sql文件,将要执行的sql操作写入进.sql文件中:

swee.sql:

DROP DATABASE IF EXISTS sweeneil;

CREATE DATABASE sweeneil;

USE sweeneil;

DROP TABLE IF EXISTS swee_friend;

CREATE TABLE swee_friend (
	d_id smallint primary key auto_increment not null,
	d_name varchar(10),
	d_hobby varchar(20),
	d_blog varchar(20),
	d_city varchar(20)
	) 
Engine=InnoDB;

INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "bbbbbbbbb", "124187545");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "458787875454", "bbbbbbbbb", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaawqeaaaaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaewqeaaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaawdaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "cccccccdqwcc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaadwaaaaa", "4545787845", "ccccccccc");
INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");

DELETE FROM swee_friend;

swee.sql主要是创建一个数据库sweeneil,然后创建数据表swee_friend,然后进行了一些插入操作。由于mysqlslap使用自定义的sql进行测试时需要指定数据库,所以数据库sweeneil需要先创建,数据表不用先创建。

 2、使用MySQL测试.sql文件内容是否正确

mysql -uroot -p123

登录进MySQL中,使用下面的语句来执行.sql文件,看有没有报错

source swee.sql

 输出信息为:

可以看到,都能执行成功,接下来就可以使用mysqlslap来跑这段sql了。

3、使用mysqlslap运行自定义的sql

我们先用 --only print查看一下,会执行些什么东西:

mysqlslap -uroot -p123 -q swee.sql --only print

 

结果发现mysqlslap只能识别第一行,我就用了一个笨方法,将swee.sql文件中的内容放置到一行上变为swee.sql(由于数据库sweeneil已经创建了,所以swee.sql中不用再做创建数据库的操作)

最新swee.sql文件内容如下:

USE sweeneil;DROP TABLE IF EXISTS swee_friend;CREATE TABLE swee_friend (d_id smallint primary key auto_increment not null,d_name varchar(10),d_hobby varchar(20),d_blog varchar(20),d_city varchar(20)) Engine=InnoDB;INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "bbbbbbbbb", "124187545");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "458787875454", "bbbbbbbbb", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaawqeaaaaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaewqeaaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaawdaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "cccccccdqwcc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaadwaaaaa", "4545787845", "ccccccccc");INSERT INTO swee_friend(d_name, d_hobby, d_blog, d_city) VALUES("hello", "aaaaaaaaaa", "4545787845", "ccccccccc");DELETE FROM swee_friend;

然后再通过--only print参数看一下会执行哪些内容:

所有的内容都被打印出来了。

 接下来开始正式运行:

./mysqlslap -uroot -p123 --create-schema sweeneil -q swee.sql

使用  --create-schema 参数指定数据库,-q 参数指定自定义的swee.sql:

 至此自定义的sql就成功执行了

五、进一步探索

1、MySQL启用日志

编辑 /etc/my.cnf 文件:

[mysqld]
log-bin=mysql/master-bin
expire_logs_days = 7
max_binlog_size = 500M

 使用log-bin指定日志文件保存位置,也算启用了日志文件,指定日志文件保存天数,以及日志文件最大大小限制。

2、设置MySQL并发数量

查看MySQL当前默认最大连接数:

mysqladmin -uroot -p123 variables |grep max_connections

 

 可以看到目前最大的连接数为151个,所以在前面设置2000个并发的时候就会报错。

下一步可以设置最大连接数,同样还是编辑MySQL配置文件 /etc/my.cnf

max_connections=2000

通过设置 max_connections 即可设置MySQL的最大连接数。更改完成后重启即可

参考

[1](总结)MySQL自带的性能压力测试工具mysqlslap详解

[2] MySQL数据库基准压力测试工具之MySQLSlap使用实例

[3] https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html

[4] Linux下修改Mysql最大并发连接数

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值