☘️博主介绍☘️:
✨又是一天没白过,我是奈斯,DBA一名✨
✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️
❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣️❣️❣️
今天给大家介绍一下MySQL附带的性能压测工具mysqlslap,在数据库性能优化和测试中,一个不可或缺的工具就是MySQL的性能压测工具mysqlslap。作为MySQL附带的一个诊断程序,mysqlslap的目标是模拟MySQL服务器所面临的客户端负载,从而提供对服务器性能的深入了解。通过模拟多用户并发访问,它能够报告每个阶段的时间,帮助我们更准确地评估数据库在实际负载下的性能表现。
mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试,是MySQL从5.1.4后自带的压力测试工具,通过模拟多个并发客户端访问MySQL来执行压力测试,同时详细的提供了“高负荷攻击MySQL”的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别。
如果你觉得我的文章有帮助,或者对我的观点感兴趣,那么请关注我吧!
目录
1、单个客户端运行1遍压测
2、并发500个客户端运行2遍压测
3、并发100和500个客户端运行5遍压测innodb存储引擎的性能进行对比
4、使用自定义sql脚本执行测试,将DQL语句在脚本中运行(更真实,使用大量真实存在的表进行DQL和DML)
mysqlslap作用:
如果准备拿一台服务器做为数据库服务器,那么这台服务器的硬件资源能够支持多大的访问压力呢?优化了操作系统的内核参数后是否提升了性能?调整了MySQL配置参数后对性能有多少影响?
通过一系列的调优工作,配合基准测试mysqlslap工具,就可以把这台服务器调整到最佳状态,也掌握了健康状态下的性能指标。那么在以后在实际运行过程中,当监控项接近了基准指标时,说明数据库服务器快要满负荷了,需要分析数据库结构设计、SQL语句这类用法问题,还是硬件资源的确不够了,然后进行相应的处理。数据库服务器也可能需要硬件升级,升级之后也需要进行基准测试,和之前的测试结果对比,确保升级后的性能是提升的,防止不恰当的升级或者错误的配置引起性能下降。
mysqlslap的运行分为三个阶段:
第一阶段:创建用于测试的模式、表和可选的任何存储程序或数据。这个阶段使用单个客户端连接。
第二阶段:运行负载测试。这个阶段可以使用许多客户端连接。
第三阶段:清理(断开连接,删除表格,如果指定)。这个阶段使用单个客户端连接。
mysqlslap --help选项:
-u, --user=:用于连接到服务器的MySQL帐户的用户名。
-p, --password=:连接到服务器时使用的密码。
-S, --socket=:指定用于连接的套接字文件的名称,socket套接字就是ip+端口,包括本地ip:port, 远程ip:port)。如果系统上有多个实例,通过连接socket可以连接相应的实例,socket可以用户连接到那个实例。
-q, --query=:指定自定义的测试SQL语句,不会加上DROP SCHEMA、CREATE SCHEMA、use、DROP SCHEMA语句。一般针对select语法语句。如果自动生成测试SQL需要使用--auto-generate-sql参数。
--create=name:指定自定义的测试SQL语句,会加上DROP SCHEMA、CREATE SCHEMA、use、DROP SCHEMA语句。如果自动生成测试SQL需要使用--auto-generate-sql参数。
-a, --auto-generate-sql:当文件中未提供或未使用命令选项(--create or --query)时,自动生成测试SQL语句和测试库mysqlslap,然后测试完成再删除,不会在数据库中留下痕迹。手动指定测试SQL需要使用--create or --query参数,并且这个参数不能和--create、--query同时使用。
--no-drop:使用 --auto-generate-sql参数会在生产测试库mysqlslap先删除(DROP SCHEMA IF EXISTS)然后测试完成后再删除(DROP SCHEMA IF EXISTS),如果加上此参数那么就不会删除测试库mysqlslap了。
--create-schema=:运行测试的架构(数据库名),不指定默认为mysqlslap库。
-c, --concurrency=:表示会话连接并发量,也就是模拟多少个客户端同时执行select。也可指定多个值以逗号或者--delimiter参数指定的值做为分隔符,如:--concurrency=100,200,500。
-i, --iterations=:迭代遍数,同样的环境下整体运行几遍,默认1遍。如果只运行一遍那么Average、Minimum、Maximum的结果都是相同的,所以要在同样的环境下运行多遍才能反应真实的结果。
-F, --delimiter=:在文件或使用命令选项提供的SQL语句中使用的分隔符是什么。
--number-of-queries=:指定总的测试查询次数(并发客户端数--concurrency * 每个客户端的查询次数)。如:--number-of-queries=1000,--concurrency=100,那么每个客户端平均查询10次。
-e, --engine=:用于创建表的存储引擎。
--auto-generate-sql-load-type=:指定测试负载类型。允许的值是read(读,scan tables)、write(写,insert into tables)、key(键,read primary keys)、update(更新,update primary keys)或mixed(混合,half inserts, half scanning selects)。默认为mixed。
--auto-generate-sql-add-autoincrement:添加一个AUTO_INCREMENT列添加到自动生成的表中。
-x, --number-char-cols=:自动生成的测试表中包含多少个字符类型的列,默认1。如果测试表字符类型只有1个那么测试结果不真实。
-y, --number-int-cols=:自动生成的测试表中包含多少个数字类型的列,默认1。如果测试表数字类型只有1个那么测试结果不真实。
--only-print:打印生成实际执行的测试SQL语句,不会实际执行(仅用于浏览将要执行的SQL)。
mysqlslap输出结果详解:
Average number of seconds to run all queries 运行所有语句一遍的平均秒数
Minimum number of seconds to run all queries 运行所有语句总遍的某一个的最小秒数
Maximum number of seconds to run all queries 运行所有语句总遍的某一个的最大秒数
Number of clients running queries 客户端数量
Average number of queries per client 每个客户端运行查询的平均数
1、单个客户端运行1遍压测
[root@mgr1 ~]# mysqlslap --auto-generate-sql -uroot -p'123456' -S /mysql/data/3306/mysql.sock
注:加上--only-print参数为打印生成实际执行的测试SQL语句,不会实际执行(仅用于浏览将要执行的SQL)。使用--auto-generate-sql参数自动生成测试库mysqlslap,然后测试完成再删除,不会在数据库中留下痕迹。
对输出的内容进行解释:
一个客户端同时运行--auto-generate-sql生成的语句算一遍,计算一遍的总时间,不是某一个客户端运行时间。
一个客户端运行一遍的平均秒数0.151,总遍的某一个的最小秒数0.151,总遍的某一个的最大秒数0.151。因为只运行了1遍所以所有的值相同。
2、并发500个客户端运行2遍压测
[root@mgr1 ~]# mysqlslap --auto-generate-sql --concurrency=500 --iterations=2 -uroot -p'123456' -S /mysql/data/3306/mysql.sock
注:加上--only-print参数为打印生成实际执行的测试SQL语句,不会实际执行(仅用于浏览将要执行的SQL)。使用--auto-generate-sql参数自动生成测试库mysqlslap,然后测试完成再删除,不会在数据库中留下痕迹。
对输出的内容进行解释:
500个客户端同时运行--auto-generate-sql生成的语句算一遍,计算一遍的总时间,不是某一个客户端运行时间。
500个客户端运行一遍的平均秒数10.046,总遍的某一个的最小秒数8.974,总遍的某一个的最大秒数11.119。因为运行了2遍那么一遍的平均秒数=(总的最小秒数+总的最大秒数)/2。
3、并发100和500个客户端运行5遍压测innodb存储引擎的性能进行对比
[root@mgr1 ~]# mysqlslap --auto-generate-sql --concurrency=100,500 --iterations=5 --engine=innodb -uroot -p'123456' -S /mysql/data/3306/mysql.sock
注:加上--only-print参数为打印生成实际执行的测试SQL语句,不会实际执行(仅用于浏览将要执行的SQL)。使用--auto-generate-sql参数自动生成测试库mysqlslap,然后测试完成再删除,不会在数据库中留下痕迹。
对输出的内容进行解释:
100或500个客户端同时运行--auto-generate-sql生成的语句算一遍,计算一遍的总时间,不是某一个客户端运行时间。
100个客户端运行一遍的平均秒数1.101,总遍的某一个的最小秒数0.897,总遍的某一个的最大秒数1.316。
500个客户端运行一遍的平均秒数9.068,总遍的某一个的最小秒数8.486,总遍的某一个的最大秒数9.455。
因为客户端是5倍之差所以一遍的平均秒数,总遍的某一个的最小秒数,总遍的某一个的最大秒数也是在5倍左右。
4、使用自定义sql脚本执行测试,将DQL语句在脚本中运行(更真实,使用大量真实存在的表进行DQL和DML)
[root@mgr1 ~]# vi q.sql
select * from itpux_m1; ---数据库中真实存在的表。1万行,在itpuxdb数据库中 select * from itpux_m5; ---数据库中真实存在的表。5万行,在itpuxdb数据库中
[root@mgr1 ~]# mysqlslap --concurrency=100 --iterations=3 --create-schema=itpuxdb --query=q.sql --delimiter=";" -uroot -p'123456' -S /mysql/data/3306/mysql.sock
注:加上--only-print参数为打印生成实际执行的测试SQL语句,不会实际执行(仅用于浏览将要执行的SQL)。
总结:
100个客户端同时运行select * from itpux_m5和itpux_m1算一遍,计算一遍的总时间,不是某一个客户端运行时间。
100个客户端运行一遍的平均秒数19.189,总遍的某一个的最小秒数18.725,总遍的某一个的最大秒数19.472。