MySQL数据库 性能压力(并发)测试工具:mysqlslap使用教程 您所在的位置:网站首页 mysql压力测试工具 MySQL数据库 性能压力(并发)测试工具:mysqlslap使用教程

MySQL数据库 性能压力(并发)测试工具:mysqlslap使用教程

2023-05-04 15:56| 来源: 网络整理| 查看: 265

mysqlslap是从Mysql5.1.4版开始的一个MySQL官方提供的自带压力测试工具。通过模拟多个并发客户端访问MySQL来执行压力测试,同时详细的提供了“高负荷攻击MySQL”的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别。

 

mysqlslap通常情况下是在bin目录下,但是有些集成环境是没有mysqlslap这个命令的,因此就不能用了。

例如,像phpstudy就没有mysqlslap,而Wamp集成环境又有mysqlslap,手工安装的MySQL百分之百是有的。

 

特别说明:

测试的过程需要生成测试表,插入测试数据,这个mysqlslap可以自动生成,默认生成一个mysqlslap的schema,如果已经存在则先删除。可以用--only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹。

 

用法:

mysqlslap [options]

 

常用参数 [options] 详细说明:

--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的相关信息。

 

各个参数的详细说明,执行“mysqlslap --help”命令: 用法: mysqlslap [OPTIONS] 从以下文件中以给定顺序读取默认选项: C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf G:\wnmp\mysql-8.0.13-winx64\my.ini G:\wnmp\mysql-8.0.13-winx64\my.cnf 读取以下组:mysqlslap客户端 以下选项可以作为第一个参数: --print-defaults 打印程序参数列表并退出 --no-defaults 不要从任何选项文件中读取默认选项,登录文件除外 --defaults-file=# 仅从给定文件#中读取默认选项。 --defaults-extra-file=# 读取全局文件后,请读取此文件。 --defaults-group-suffix=# 还读取带有concat的组(group, suffix) --login-path=# 从登录文件中读取此路径。 -?, --help 显示此帮助并退出。 -a, --auto-generate-sql 在文件或命令行未提供的地方生成SQL。 --auto-generate-sql-add-autoincrement 将AUTO_INCREMENT列添加到自动生成的表中。 --auto-generate-sql-execute-number=# 设置此数字可生成一定数量的要运行的查询。 --auto-generate-sql-guid-primary 将基于GUID的主键添加到自动生成的表中。 --auto-generate-sql-load-type=name 指定测试负载类型:混合,更新,写入,键或读取; 默认是混合的。 --auto-generate-sql-secondary-indexes=# 要添加到自动生成的表的二级索引数。 --auto-generate-sql-unique-query-number=# 为自动测试生成的唯一查询数。 --auto-generate-sql-unique-write-number=# 为auto-generate-sql-write-number生成的唯一查询的数量。 --auto-generate-sql-write-number=# 每个线程要执行的行插入数(默认是100)。 --commit=# 提交记录每X个语句。 -C, --compress 在服务器/客户端协议中使用压缩。 -c, --concurrency=name 模拟运行查询的客户端数量。 --create=name 使用创建表的文件或字符串。 --create-schema=name 用于运行测试的架构。 --csv[=name] 如果未命名文件,则将CSV输出生成到命名文件或stdout。 -#, --debug[=#] 这是非调试版本。 赶上并退出。 --debug-check 这是非调试版本。 赶上并退出。 -T, --debug-info 这是非调试版本。 赶上并退出。 --default-auth=name 要使用的默认身份验证客户端插件。 -F, --delimiter=name 在文件或文件中提供的SQL语句中使用的定界符命令行。 --detach=# X个请求后,断开(关闭并重新打开)连接。 --enable-cleartext-plugin 启用/禁用明文身份验证插件。 -e, --engine=name 用于创建表的存储引擎。 -h, --host=name 连接到主机。 -i, --iterations=# 运行测试的次数。 --no-drop 测试后不要删除架构。 -x, --number-char-cols=name 如果指定--auto-generate-sql,则要在表中创建的VARCHAR列数。 -y, --number-int-cols=name 如果指定--auto-generate-sql,则在表中创建的INT列数。 --number-of-queries=# 将每个客户端限制为该查询数量(这是不正确的)。 --only-print 不连接数据库,而是打印输出 -p, --password[=name] 连接服务器时使用的密码。 如果未提供密码,则从tty询问。 -W, --pipe 使用命名管道连接到服务器。 --plugin-dir=name 客户端插件的目录。 -P, --port=# 用于连接的端口号。 --post-query=name 运行查询或包含查询的文件将在之后执行测试已经完成。 --post-system=name 在测试完成后执行的system()字符串。 --pre-query=name 要运行的查询或包含要在运行测试之前执行的查询的文件。 --pre-system=name 要在运行测试之前执行的system()字符串。 --protocol=name 用于连接的协议(tcp, socket, pipe,memory) -q, --query=name 要运行的查询或包含要运行的查询的文件。 --shared-memory-base-name=name 共享内存的基本名称。 -s, --silent 以静默方式运行程序-无输出。 -S, --socket=name 用于连接的套接字文件。 --sql-mode=name 指定sql-mode以运行mysqlslap工具。 --server-public-key-path=name 服务器公共RSA密钥(PEM格式)的文件路径。 --get-server-public-key 获取服务器公钥 --ssl-mode=name SSL连接模式。 --ssl-ca=name PEM格式的CA文件。 --ssl-capath=name CA目录。 --ssl-cert=name PEM格式的X509证书。 --ssl-cipher=name 要使用的SSL密码。 --ssl-key=name X509密钥为PEM格式。 --ssl-crl=name 证书吊销列表。 --ssl-crlpath=name 证书吊销列表路径。 --tls-version=name 要使用的TLS版本,允许的值为:TLSv1,TLSv1.1,TLSv1.2 --ssl-fips-mode=name SSL FIPS模式(仅适用于OpenSSL); 允许的值是:OFF,ON,STRICT -u, --user=name 如果不是当前用户,则为登录用户。 -v, --verbose 输出更详细; 您可以多次使用获得更详细的输出。 -V, --version 输出版本信息并退出。

 

mysqlslap 使用示例

 

1、单线程测试。-p后面跟的是mysql的root密码

# mysqlslap -a -uroot -proot

 

2、多线程测试。使用–concurrency来模拟并发连接

# mysqlslap -a -c 100 -uroot -proot

 

3、迭代测试。用于需要多次执行测试得到平均值

# mysqlslap -a -i 10 -uroot -proot # mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -proot # mysqlslap -a --auto-generate-sql-load-type=read -uroot -proot # mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -proot # mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -proot # mysqlslap --create-schema world -q "select count(*) from City" -uroot -proot # mysqlslap -a -e innodb -uroot -proot # mysqlslap -a --number-of-queries=10 -uroot -proot

 

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

# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -proot

 

5、执行一次测试,分别50和100个并发,执行1000次总查询:

# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -proot

 

6、50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:

# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -proot

 

以下是我测试的一位朋友的Mysql数据库服务器的过程以及结果:

 

[[email protected] bin]# mysqlslap -hlocalhost -uroot -proot -P3306 --concurrency=1000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000 --debug-info Warning: Using a password on the command line interface can be insecure. Benchmark Running for engine innodb Average number of seconds to run all queries: 0.060 seconds Minimum number of seconds to run all queries: 0.060 seconds Maximum number of seconds to run all queries: 0.060 seconds Number of clients running queries: 1000 Average number of queries per client: 1 User time 0.08, System time 0.43 Maximum resident set size 28220, Integral resident set size 0 Non-physical pagefaults 7459, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 16324, Involuntary context switches 39

 

上面是在mysql的bin目录下执行的命令。

我们可以看出1000的并发量对于单个数据库而言是没有问题的,下面看5000的并发量:

[[email protected] bin]# mysqlslap -hlocalhost -uroot -proot -P3306 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=5000 --debug-info Warning: Using a password on the command line interface can be insecure. Benchmark Running for engine innodb Average number of seconds to run all queries: 0.598 seconds Minimum number of seconds to run all queries: 0.598 seconds Maximum number of seconds to run all queries: 0.598 seconds Number of clients running queries: 5000 Average number of queries per client: 1 User time 0.53, System time 1.88 Maximum resident set size 134844, Integral resident set size 0 Non-physical pagefaults 30313, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 96141, Involuntary context switches 33

 

这时候数据库就有点吃力了,再看12000的并发量:

[[email protected] bin]# mysqlslap -hlocalhost -uroot -proot -P3306 --concurrency=12000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=12000 --debug-info mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections mysqlslap: Error when connecting to server: 1040 Too many connections Benchmark Running for engine innodb Average number of seconds to run all queries: 1.141 seconds Minimum number of seconds to run all queries: 1.141 seconds Maximum number of seconds to run all queries: 1.141 seconds Number of clients running queries: 12000 Average number of queries per client: 1 User time 1.68, System time 4.36 Maximum resident set size 303504, Integral resident set size 0 Non-physical pagefaults 68515, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 271921, Involuntary context switches 81

 

这时候,MySQL就拒绝了部分请求。所以单节点数据库的查询并发超过10000,就扛不住了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有