如何使用 mysqlslap 在 OceanBase 数据库中模拟客户端高并发或快速构造测试数据?

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 快速构造测试数据的方法如下:

  1. 创建测试数据表,本文以

    t1

    为例。

obclient> CREATE TABLE t1(id int auto_increment PRIMARY KEY,name VARCHAR(30),u_num INT ,comment VARCHAR(200));

  1. 说明如果创建数据库时未指定参数

    –create-schema

    ,mysqlslap会自动创建数据库名称为

    mysqlslap

    的数据库。

  2. 创建测试 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’);

  1. 执行 mysqlslap 并发命令。

  2. 本例中,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

  1. 登录数据库查看执行结果。
  2. 可以看到 t1 表中包含了将试脚本执行 100 次后的 200 行数据。

obclient> SELECT count(*) FROM t1; ±---------+ | count(*) | ±---------+ | 200 | ±---------+ 1 row in set (0.01 sec)

模拟客户端高并发

使用 mysqlslap 模拟客户端高并发的方法如下:

  1. 使用 select sleep(n) 发起 n 个并发。
  2. 本例以 n=10 为例,发起 10 个并发查询。

[root@hostname mysqlclap]# mysqlslap -h[IP] -P[端口]-u[用户信息] -p[‘密码’] --concurrency=10 --query=‘select sleep(30)’

  1. 说明OceanBase 数据库会话的默认超时时间为 10s,注意保证 SQL 执行时间在超时时间内,或者调整超时时间变量进行测试。
  2. 登录数据库查看实时会话。
  3. 可以看到正在并行执行的会话。

obclient> SELECT * FROM information_schema.processlist WHERE user=‘root’ AND COMMAND=‘Query’ AND time<>0;

666

学习了