使用 MySQLslap 对 GreatSQL 压力测试步骤

文摘   科技   2024-09-25 08:01   福建  

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。


MySQLslap 运行三个阶段

  • 第一阶段:创建用于测试的模式、表和可选的任何存储程序或数据。这个阶段使用单个客户端连接。

  • 第二阶段:运行负载测试。这个阶段可以使用许多客户端连接。

  • 第三阶段:清理(断开连接,删除表格,如果指定)。这个阶段使用单个客户端连接。

MySQLslap 选项

  • -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遍压测

$ 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遍压测

$ 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遍压测iINNODB存储引擎的性能进行对比

$ 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)

$ vi q.sql

select * from itpux_m1;   ---数据库中真实存在的表。1万行,在itpuxdb数据库中
select * from itpux_m5;   ---数据库中真实存在的表。5万行,在itpuxdb数据库中          

$ 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_m5itpux_m1算一遍,计算一遍的总时间,不是某一个客户端运行时间。

  • 100个客户端运行一遍的平均秒数19.189,总遍的某一个的最小秒数18.725,总遍的某一个的最大秒数19.472。


Enjoy GreatSQL :)

<往 期 推 荐>
GreatSQL 中为什么 Update 不会被锁等待
诚邀莅临丨赋能开源生态建设  GreatSQL邀您参加2024开放原子开源生态大会
Percona Toolkit 神器全攻略(性能类)
GreatSQL 异步复制及搭建
Percona Toolkit 神器全攻略(复制类)

《GreatSQL运维实战》视频课程

<关于 GreatSQL>

GreatSQL数据库是一款开源免费数据库,可在普通硬件上满足金融级应用场景,具有高可用、高性能、高兼容、高安全等特性,可作为MySQL或Percona Server for MySQL的理想可选替换。

💻社区官网: https://greatsql.cn/ 
Gitee  https://gitee.com/GreatSQL/GreatSQL
GitHub  https://github.com/GreatSQL/

🆙BiliBili  : https://space.bilibili.com/1363850082

(对文章有疑问或见解可去社区官网提出哦~)

加入微信交流群
加入QQ交流群

想看更多技术好文,点个"在看"吧!

GreatSQL社区
专注GreatSQL数据库及相关产品
 最新文章