[总结] 简述 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 协议》,转载必须注明作者和本文链接
来杯可乐不加糖。
讨论数量: 2
lmaster

有干货

但最后一句话才是本文重点吧,同时有些地方排版有点乱。

4年前 评论
来杯可乐不加糖 (楼主) 4年前
lmaster

@来杯可乐不加糖 论坛用是 markdown 编辑器

4年前 评论
来杯可乐不加糖 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!