转:作为 DBA,你不得不掌握的压测工具

说实话,很多公司的数据库系统,没经过压测,就直接上了线。能承载多少人同时访问,完全黑盒。每个人数据库开发者,都该好好看看。

以下文章来源于 MySQL 数据库技术栈 ,作者 Love 梦晨

mysqlslap

    mysqlslap 是 MySQL 自带的一个用于实现负载性能测试和压力测试的工具。它可以模拟多个客户端对数据库进行施压,并生成报告来了解数据库的性能状况。

mysqlslap 的运行过程主要分三步:

  1. 创建库、表,导入数据用于测试。此过程由单线程完成。
  2. 开始进行压力测试。该步骤可以使用多线程完成。
  3. 清理测试数据。此过程由单线程完成。

下面举几个例子来说明下如何使用 mysqlslap。

  1. 自动生成测试表,其中会生成自增列,采用单线程进行测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node1 ~]# mysqlslap -uroot -p --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement
Enter password:
Benchmark
#运行所有语句的平局时间,单位秒
Average number of seconds to run all queries: 0.018 seconds
#运行所有语句的最小秒数
Minimum number of seconds to run all queries: 0.018 seconds
#运行所有语句的最大秒数
Maximum number of seconds to run all queries: 0.018 seconds
#客户端数量
Number of clients running queries: 1
#每个客户端运行查询的平均数
Average number of queries per client: 0

参数解释:

–auto-generate-sql:自动生成测试表和数据,mysqlslap 工具自己生成 sql 脚本进行测试。

–auto-generate-sql-load-type:指定测试语句的类型。取值包括:read,key,write,update 和 mixed(默认)。

–auto-generate-sql-add-autoincrement:生成的表中会添加自增列。

2. 指定客户端的数量以及总的查询次数

1
2
mysqlslap -uroot -p --auto-generate-sql --auto-generate-sql-load-type=mixed --concurrency=100 --number-of-queries=1000

–concurrency=100:指定同时有 100 个客户端连接
–number-of-queries=1000:指定总的测试查询次数,该值除以 concurrency 的值就是每个客户端执行的查询次数。

3. 自定义表结构以及 SQL 语句,指定 50 个客户端,运行测试 200 次

1
mysqlslap --delimiter=";" --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23)" --query="SELECT * FROM a" --concurrency=50 --iterations=200

–iterations:代表要运行测试多少次。

  1. 使用参数指定列的数量和类型,比如 int 类型的字段两列,varchar 类型的字段 3 列。
1
mysqlslap -uroot -p --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql
  1. 从指定文件中加载 create、insert、和 select 语句,当文件中有多条语句时用”;” 隔开。
1
mysqlslap --concurrency=5 --iterations=5 --query=query.sql --create=create.sql --delimiter=";"

sysbench

    sysbench 是一款非常强大的数据库测试工具,它可以执行多种类型的基准测试,目前主要支持 MySQL、PostgreSQL、Oracle 这 3 种数据库。

它可以从 https://github.com/akopytov/sysbench 下载源码包。

安装

1
2
3
4
5
6
7
8
9
cd sysbench-0.5
./autogen.sh
./configure --prefix=/usr/local/sysbench --build=x86_64
make && make install
cp /usr/local/sysbench/bin/sysbench /usr/bin/
验证sysbench安装是否成功。
[root@node1 ~]# sysbench --version
sysbench 0.5

针对 CPU 的基准测试

测试计算素数直到某个最大值所需要的时间。

1
2
3
4
5
6
7
8
9
[root@node1 ~]# sysbench --test=cpu --cpu-max-prime=2000 run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Random number generator seed is 0 and will be ignored
…………………………
General statistics:
total time: 1.1302s
…………………………….

针对内存的基准测试

1
sysbench --test=memory --memory-block-size=8k --memory-total-size=100G run

针对文件 IO 的基准测试

  1. 首先生成测试文件:随机写 128 个文件,共计 2G
1
sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw prepare

2. 随机读取测试⽂件,查看耗费的时间

1
sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw run

其中 –file-test-mode 的选项如下:
seqwr: 顺序写入
seqrewr: 顺序重写
seqrd: 顺序读取
rndrd: 随机读取
rndwr: 随机写入
rndrw: 混合随机读写

3. 测试完成,清理测试数据

1
sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw cleanup

针对 OLTP 的基准测试

  1. 首先生成测试数据,下面生成一张数据量百万行记录的表。
1
2
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password=root prepare

查询生成的测试数据:

1
2
3
4
5
6
7
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+

2. 进行读取验证,采用 8 个并发线程,开启只读模式

1
2
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password=root --max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run

测试结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
OLTP test statistics:
queries performed:
read: 407498
write: 0
other: 58214
total: 465712
transactions: 29107 (485.07 per sec.)
read/write requests: 407498 (6790.91 per sec.)
other operations: 58214 (970.13 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.0064s
total number of events: 29107
total time taken by event execution: 479.9865s
response time:
min: 1.55ms
avg: 16.49ms
max: 539.30ms
approx. 95 percentile: 25.98ms
Threads fairness:
events (avg/stddev): 3638.3750/42.84
execution time (avg/stddev): 59.9983/0.00

其中 transactions 代表了测试结果的主要评判标准,即 TPS,上述测试结果中的 tps 是 485.7,response time 中展示了响应时间的统计信息,展示了最小、最大、平均响应时间,以及 95% 百分比的响应时间。

3. 清理测试数据

1
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password=root cleanup