[总结] 简述 MySQL 基准测试工具
一、什么是基准测试
定义:
基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件变化时,重新进行基准测试以评估变化对性能的影响。
区别:
基准测试是针对系统设置的一种压力测试。(简化的压力测试:直接、简单、易于比较,用于评估服务器的处理能力。不关心业务逻辑,所使用的查询和业务的真实性可以和业务环境没关系)
压力测试是对真实的业务数据进行测试,获得真实系统所能承受的压力。(需要不同主题所使用的数据和查询也是真实用到的)
目的:
- 建立MySQL服务器的性能基准线 (确认当前MySQL服务器运行情况)
- 模拟比当前系统更高的负载,以找出系统的扩展瓶颈 (增加数据库并发,观察QPS,TPS变化,确定并发量与性能最优的关系)
- 测试不同的硬件、软件和操作系统配置 (软硬件对数据库性能的影响)
- 证明新的硬件设备是否配置正确
常见指标:
- 单位时间内所处理的事务数(TPS)
- 单位时间内所处理的查询数(QPS)
- 响应时间(us,ms,s等)
- 平均响应时间
- 最小响应时间
- 最大响应时间
- 各时间所占百分比(最有参考意义)
- 并发量 (同时处理的查询请求的数量)
- 注:并发量不等于连接数
- 注:需要关注的是正在工作中的并发的操作数或同时工作的数量
二、基准测试步骤
计划和设计基准测试
- 对整个系统还是某一组件
- 使用什么样的数据
- 反应系统实际情况则需要
- 生产环境数据与生产环境SQL
- 生产数据备份
- 测试时间段内产生的SQL日志多性能的回放
- 相对复杂
- 参数调整对性能的影响只需要
- 测试工具完成
- 反应系统实际情况则需要
- 计算测试时间和次数
- 准备基准测试及数据收集脚本(收集一下信息)
- CPU使用率
- IO
- 网络流量
- 状态与计数器信息等
- 脚本:Get_Test_Info.sh
- 运行基准测试
- 保存及分析基准测试结果
基准测试中容易忽略的问题:
- 在生产环境数据时只使用了部分数据
- 在多用户场景中,只做了单用户的测试(推荐使用多线程并发测试)
- 单服务器上测试分布式应用(推荐使用相同架构的测试)
- 反复执行同一查询(容易缓存命中,无法反应真实查询性能)
三、基准测试工具
系统测试:
- Apache Bench
- Httpload
MySQL测试:
- mysqlslap
- sysbench
下文重点讲述MySQL测试。
MySQLSLAP:
MySQL服务器自带的基准测试工具,随MySQL 一起安装
特点:
- 可以模拟服务器负载,并输出相关统计信息
- 可以指定也可以自动生成查询语句
缺点:
- innodb建立无索引(不通用)
- 无法对服务器硬件测试(CPU 、I/O、 内存)\
参数:
--auto-generate-sql #由系统自动生成SQL脚本进行测试
--auto-generate-sql-add-autoincrement #在生成的表中增加自增ID
--auto-generate-sql-load-type #指定测试中使用的查询类型
--auto-generate-sql-write-number #指定初始化数据时生成的数据量
--concurrency #指定并发线程的数量,可用逗号分隔
--engine #指定要测试表的存储引擎,可以用逗号分割多个存储引擎
--no-drop #指定不清理测试数据
--iterations #指定测试运行次数(若设置,则no-drop无效)
--number-of-queries #指定每一个线程执行的查询数量
--debug-info #指定输出额外的内存及CPU统计信息
--number-int-cols #指定测试表中包含的INT类型列的数量
--number-char-cols #指定测试表中包含的varchar类型的数量
--create-schema #指定了用于执行测试的数据库的名字
--query #用于指定自定义SQL的脚本(存储)
--only-print #并不运行测试脚本,而是把生成的脚本打印出来
查看更多参数:mysqlslap --help
举例:
1、创建测试账号或直接使用原有账号密码:grant all privileges on *.* to [db_username]@'localhost' identified by [db_password];
2、命令:mysqlslap -hlocalhost -u[数据库账号] -p[数据库密码] -P3306 --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=stest
3、打印脚本:mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=sbtest --only-print > test.log
如图:
SYSBENCH:
特点:
- 常用测试工具(适合innodb测试)
- 可以对服务器硬件测试(CPU 、I/O、 内存)
安装:
1、wget https://github.com/akopytov/sysbench/archive/0.5.zip
2、unzip sysbench-0.5.zip
3、cd sysbench
4、./autogen.sh
5、./configure --with-mysql-includes=/usr/local/mysql/include/ \--with-mysql-libs=/usr/local/mysql/lib/ (指定mysql下include目录和libs目录)
6、make && make install
7、sysbench --help //检查是否安装成功(如下图所示,则表示安装成功)
常用参数:
-- test #用于指定索要执行的测试类型,支持以下参数:
Fileio #文件系统I/O性能测试
cpu #CPU性能测试
memory #内存性能测试
Oltp #测试要指定具体的lua脚本(lua脚本位于 sysbench-0.5/sysbench/tests/db)
--mysql-db #用于指定执行基准测试的数据库名
--mysql-table-engine #用于指定所使用的存储引擎
--oltp-tables-count #执行测试的表的数量
--oltp-table-size #指定每个表中的数据行数
--num-threads #指定测试的并发线程数量
--max-time #指定最大的测试时间
--max-requests #请求的最大数目,0表示不限制
--thread-stack-size #每个线程的堆栈大小 32K
--init-rng #在测试开始之前指定是否需要初始化随机数发生器 off
--report-interval #指定间隔多长时间输出一次统计信息
--test #指定测试项目名称 Required
--debug #是否显示更多的调试信息 off
--validate #在可能的情况下是否进行验证检查 off
--help #帮助信息 off
--verbosity #详细级别,0-严重信息,5-调试信息
--percentile #表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值
--mysql-user #指定执行测试的MySQL用户
--mysql-password #指定执行测试的MySQL用户的密码
prepare #用于准备测试数据
run #用于实际进行测试
cleanup #用于清理测试数据
举例:
A、测试CPU
sysbench --test=cpu --cpu-max-prime=10000 run
#CPU测试使用64位整数,测试计算质数直到某个最大值所需要的时间,
#cpu测试主要是进行素数的加法运算,在上面的例子中,
#指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值,
#主要看total time所花费的时间
如图:
B、测试线程
sysbench --test=threads --num-threads=800 --thread-yields=100 --thread-locks=10 run
#thread-locks小于线程数除以2,lock越少,处理时间越长
C、测试IO
1、查看内存:free -m
2、查看磁盘空间:df -lh 如图1所示
3、创建测试文件夹,准备测试数据:sysbench --test=fileio --file-total-size=1G prepare
4、查看fileio的参数:sysbench --test=fileio --help
5、sysbench --test=fileio --num-threads=8 --init-rng=on --file-total-size=1G --file-test-mode=rndrw --report-interval=1 run
#如图2所示
如图所示:
图1:
图2:
D、测试OTLP
建立测试环境
1、建立测试数据库:create database base_test;
2、建立测试账户:grant all privileges on *.* to [db_username]@'localhost' identified by ['db_password'];
进入sysbench:cd /sysbench-0.5/sysbench/tests
准备命令:sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=base_test --mysql-user=[db_username]--mysql-password=[db_password] --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock prepare
执行监听脚本:bash ./Get_Test_info.sh &
查看脚本运行状态:ps -ef
测试命令:sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=base_test --mysql-user=[db_username]--mysql-password=[db_password] --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock run
查看测试效果:
1、在数据库中:show processlist
2、查看测试信息(Get_Test_info.sh里面指定文件夹) //打印 TS TS 1563176835.003951886 2019-07-15 15:47:15
3、收集完成后停止脚本收集命令:rm -rf running
4、分析收集信息:./analyze.sh /base_test/sysbench/benchmarks/5-sec-status-2019-07-15_03-status
注:
查看文件位置:
find / -name mysql | mysql.sock | oltp.lua
whereis mysql等方法
获取脚本:
Get_Test_info.sh中路径需要修改为系统实际路径
关注公众号,后台回复脚本,获取shell脚本(analyze.sh,Get_Test_info.sh)
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: