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

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,就扛不住了。

    A+
发布日期:2019年11月13日 14:00:25  所属分类:Mysql
最后更新时间:2019-11-13 14:02:29
评分: (1 票;平均数5.00 ;最高评分 5 ;用户总数1;总得分 5;百分比100.00)
付杰
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
  • ¥ 6.8元
  • 市场价:8.8元
刷流量 刷人气 刷点击 刷收藏 刷APP关键词
刷流量 刷人气 刷点击 刷收藏 刷APP关键词
  • ¥ 1.0元
  • 市场价:9.9元
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
  • ¥ 199.9元
  • 市场价:20000元
wordpress站群服务 泛解析二级域名 二级目录站群
wordpress站群服务 泛解析二级域名 二级目录站群
  • ¥ 1999.9元
  • 市场价:4800元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: