mysqlslap 是 MySQL 原生的基准压力测试工具,可以模拟多个客户端同时并发的向服务器发出查询。本文主要介绍在 OceanBase 数据库中使用 mysqlslap 模拟客户端高并发或快速构造测试数据的方法。
适用场景
测试定位问题的时候,有个别场景需要快速在某张表灌入一定数量的测试数据,或者在特定场景中需要模拟大批量的并发连接执行 SQL 的需求。
本文适用于 OceanBase 数据库的 MySQL 模式中的以下场景:
- 基础简单压力测试。
- 快速在测试表中导入执行目标指定 SQL,以构造测试数据。
- 模拟特定 SQL 语句(SELECT、UPDATE)高并发,辅助定位 SQL,复现高并发场景的 bug。
- 并发调用存储过程脚本测试。
mysqlslap 介绍
mysqlslap 工具的使用方式可以在命令行中使用
–help
参数查看。
mysqlslap --help Usage: mysqlslap [OPTIONS] --concurrency 并发数量,多个可以用逗号隔开。 --iterations 重复运行次数 --number-of-queries 总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算 --debug-info 额外输出CPU以及内存的相关信息 --create-schema 测试的database --query 脚本执行测试(可以在单引号中设置要执行的 SQL 语句或者 SQL 脚本路径) --only-print 只打印不执行SQL
构造测试数据
使用 mysqlslap 快速构造测试数据的方法如下:
-
创建测试数据表,本文以
t1
为例。
obclient> CREATE TABLE t1(id int auto_increment PRIMARY KEY,name VARCHAR(30),u_num INT ,comment VARCHAR(200));
-
说明如果创建数据库时未指定参数
–create-schema
,mysqlslap会自动创建数据库名称为
mysqlslap
的数据库。
-
创建测试 SQL 脚本。
[root@hostname /]# cd mysqlclap [root@hostname mysqlclap]# vim /tmp/query.sql insert into t1(name,u_num,comment) values(‘Abed’,30,‘abcd’); insert into t1(name,u_num,comment) values(‘Jim’,40,‘abcd’);
-
执行 mysqlslap 并发命令。
-
本例中,SQL 脚本中有 2 条 INSERT 语句。其中,
–concurrency=100
参数表示执行一次 100 个并发,
–iterations=1
表示迭代执行一次。
[root@hostname mysqlclap]# mysqlslap -h[IP] -P[端口]-u[用户信息] -p[‘密码’] --concurrency=100 --iterations=1 --query=/tmp/query.sql
- 登录数据库查看执行结果。
- 可以看到 t1 表中包含了将试脚本执行 100 次后的 200 行数据。
obclient> SELECT count(*) FROM t1; ±---------+ | count(*) | ±---------+ | 200 | ±---------+ 1 row in set (0.01 sec)
模拟客户端高并发
使用 mysqlslap 模拟客户端高并发的方法如下:
- 使用 select sleep(n) 发起 n 个并发。
- 本例以 n=10 为例,发起 10 个并发查询。
[root@hostname mysqlclap]# mysqlslap -h[IP] -P[端口]-u[用户信息] -p[‘密码’] --concurrency=10 --query=‘select sleep(30)’
- 说明OceanBase 数据库会话的默认超时时间为 10s,注意保证 SQL 执行时间在超时时间内,或者调整超时时间变量进行测试。
- 登录数据库查看实时会话。
- 可以看到正在并行执行的会话。
obclient> SELECT * FROM information_schema.processlist WHERE user=‘root’ AND COMMAND=‘Query’ AND time<>0;