一、基准测试

基准测试(benchmark)是针对系统设计的一种压力测试。

基准测试是简化了的压力测试。

1.1 常见指标

  • TPS
  • QPS
  • 响应时间
  • 并发量

1.2 收集与分析数据脚本

收集数据的shell脚本gather.sh

  1. #!/bin/sh
  2. INTERVAL=5
  3. PREFIX=$INTERVAL-sec-status
  4. RUNFILE=/home/benchmarks/running
  5. mysql -e 'SHOW GLOBAL VARIABLES' >> mysql-variables
  6. while test -e $RUNFILE; do
  7. file=$(date +%F_%I)
  8. sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
  9. sleep $sleep
  10. ts="$(date +"TS %s.%N %F %T")"
  11. loadavg="$(uptime)"
  12. echo "$ts $loadavg" >> $PREFIX-${file}-status
  13. mysql -e 'show global status;' >> $PREFIX-${file}-status &
  14. echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
  15. mysql -e 'show engine innodb status;' >> $PREFIX-${file}-innodbstatus &
  16. echo "$ts $loadavg" >> $PREFIX-${file}-processlist
  17. mysql -e 'show full processlist;' >> $PREFIX-${file}-processlist &
  18. echo $ts
  19. done
  20. echo Exiting because $RUNFILE does not exist.

分析数据脚本analyze.sh

  1. #!/bin/sh
  2. awk '
  3. BEGIN {
  4. printf "#ts date time load QPS"
  5. fmt = " %.2f"
  6. }
  7. /^TS/ {
  8. ts = substr($2, 1, index($2, ".")-1);
  9. load = NF-2;
  10. diff = ts - prev_ts;
  11. prev_ts = ts;
  12. printf "\n%s %s %s %s", ts, $3, $4, substr($load, 1, length($load) - 1);
  13. }
  14. /Queries/ {
  15. printf fmt, ($2-Queries)/diff;
  16. Queries=$2;
  17. }
  18. ' "$@"

二、基准测试工具

2.1 mysqlslap

常用参数

  1. # mysqlslap --help
  2. --auto-generate-sql 由系统自动生成SQL脚本进行测试
  3. --auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
  4. --auto-generate-sql-load-type=name 指定测试中使用的查询类型
  5. --auto-generate-sql-execute-number= 指定初始化数据时生成的数据量
  6. --concurrency= 指定并发线程的数量
  7. --engine 指定要测试表的存储引擎,可以用逗号分割多个存储引擎
  8. --no-drop 指定不清理测试数据
  9. --iterations 指定测试运行的次数
  10. --number-of-queries 指定每一个线程执行的查询数量
  11. --debug-info 指定输出额外的内存及CPU统计信息
  12. --number-int-cols 指定测试表中包含的INT类型列的数量
  13. --number-char-cols 指定测试表中包含的varchar类型的数量
  14. --create-schema 指定了用于执行测试的数据库的名字
  15. --query 用于指定自定义SQL的脚本
  16. --only-print 并不运行测试脚本,而是把生成的脚本打印出来

示例

  1. mysqlslap \
  2. --concurrency=1,50,100,200 \
  3. --iterations=3 \
  4. --number-int-cols=5 \
  5. --number-char-cols=5 \
  6. --auto-generate-sql \
  7. --auto-generate-sql-add-autoincrement \
  8. --engine=myisam,innodb \
  9. --number-of-queries=10 \
  10. --create-schema=test \
  11. > 1.txt

测试结果

  1. [root@mysql211 ~]# cat 1.txt
  2. Benchmark
  3. Running for engine myisam
  4. Average number of seconds to run all queries: 0.001 seconds
  5. Minimum number of seconds to run all queries: 0.001 seconds
  6. Maximum number of seconds to run all queries: 0.001 seconds
  7. Number of clients running queries: 1
  8. Average number of queries per client: 10
  9. Benchmark
  10. Running for engine myisam
  11. Average number of seconds to run all queries: 0.043 seconds
  12. Minimum number of seconds to run all queries: 0.037 seconds
  13. Maximum number of seconds to run all queries: 0.052 seconds
  14. Number of clients running queries: 50
  15. Average number of queries per client: 0
  16. Benchmark
  17. Running for engine myisam
  18. Average number of seconds to run all queries: 0.082 seconds
  19. Minimum number of seconds to run all queries: 0.082 seconds
  20. Maximum number of seconds to run all queries: 0.084 seconds
  21. Number of clients running queries: 100
  22. Average number of queries per client: 0
  23. Benchmark
  24. Running for engine myisam
  25. Average number of seconds to run all queries: 0.245 seconds
  26. Minimum number of seconds to run all queries: 0.245 seconds
  27. Maximum number of seconds to run all queries: 0.246 seconds
  28. Number of clients running queries: 200
  29. Average number of queries per client: 0
  30. Benchmark
  31. Running for engine innodb
  32. Average number of seconds to run all queries: 0.007 seconds
  33. Minimum number of seconds to run all queries: 0.002 seconds
  34. Maximum number of seconds to run all queries: 0.010 seconds
  35. Number of clients running queries: 1
  36. Average number of queries per client: 10
  37. Benchmark
  38. Running for engine innodb
  39. Average number of seconds to run all queries: 0.229 seconds
  40. Minimum number of seconds to run all queries: 0.212 seconds
  41. Maximum number of seconds to run all queries: 0.238 seconds
  42. Number of clients running queries: 50
  43. Average number of queries per client: 0
  44. Benchmark
  45. Running for engine innodb
  46. Average number of seconds to run all queries: 0.519 seconds
  47. Minimum number of seconds to run all queries: 0.471 seconds
  48. Maximum number of seconds to run all queries: 0.555 seconds
  49. Number of clients running queries: 100
  50. Average number of queries per client: 0
  51. Benchmark
  52. Running for engine innodb
  53. Average number of seconds to run all queries: 0.849 seconds
  54. Minimum number of seconds to run all queries: 0.767 seconds
  55. Maximum number of seconds to run all queries: 0.909 seconds
  56. Number of clients running queries: 200
  57. Average number of queries per client: 0
  58. [root@mysql211 ~]#

2.2 sysbench 0.5

下载

  1. # MySQL上找到的版本太低
  2. # https://dev.mysql.com/downloads/benchmarks.html
  3. wget https://downloads.mysql.com/source/sysbench-0.4.12.14.tar.gz
  4. # https://github.com/akopytov/sysbench/releases
  5. wget https://github.com/akopytov/sysbench/archive/1.0.13.tar.gz
  6. wget https://github.com/akopytov/sysbench/archive/0.5.zip

安装,参照解压后的README.md

  1. # 解压 解压后目录为 ~/sysbench-0.5
  2. unzip sysbench-0.5.zip
  3. cd sysbench-0.5
  4. # 运行后没报错就可以继续
  5. ./autogen.sh
  6. # 配置
  7. ./configure \
  8. --with-mysql-includes=/usr/local/mysql/include \
  9. --with-mysql-libs=/usr/local/mysql/lib
  10. # 编译安装
  11. make && make install

常用参数

  1. sysbench --help
  2. --test 用于指定所要执行的测试类型,支持以下参数
  3. fileio - File I/O test 文件系统I/O性能测试
  4. cpu - CPU performance test CPU性能测试
  5. memory - Memory functions speed test 内存性能测试
  6. threads - Threads subsystem performance test
  7. mutex - Mutex performance test
  8. Oltp测试要指定具体的lua脚本
  9. Lua脚本位于sysbench-0.5/sysbench/tests/db
  10. --mysql-db 用于指定执行基准测试的数据库名
  11. --mysql-table-engine 用于指定所使用的存储引擎
  12. --oltp-tables-count 执行测试的表的数量
  13. --oltp-table-size 指定每个表中的数据行数
  14. --num-threads 指定测试的并发线程数量
  15. --max-time 指定最大的测试时间
  16. --report-interval 指定间隔多长时间输出一次统计信息
  17. --mysql-user 指定执行测试的MySQL用户
  18. --mysql-password 指定执行测试的MySQL用户的密码
  19. prepare 用于准备测试数据
  20. run 用于实际进行测试
  21. cleanup 用于清理测试数据

测试CPU

  1. sysbench --test=cpu --cpu-max-prime=1000 run

测试磁盘I/O

  1. # free -m看内存
  2. sysbench --test=fileio --file-total-size=1G prepare
  3. # 查看相关参数
  4. sysbench --test=fileio --help
  5. # 测试
  6. sysbench --test=fileio \
  7. --num-threads=8 \
  8. --init-rng=on \
  9. --file-total-size=1G \
  10. --file-test-mode=rndrw \
  11. --report-interval=1 \
  12. run

2.3 sysbench 测试数据库

创建库和表

  1. create database dbtest;
  2. grant all privileges on *.* to dbtest@'localhost' identified by '123456';

准备生成表和数据

  1. # 进入脚本目录
  2. cd ~/root/sysbench-0.5/sysbench/tests/db
  3. # 查看脚本
  4. ls -l *.lua
  5. # 准备
  6. sysbench --test=./oltp.lua \
  7. --mysql-table-engine=innodb \
  8. --oltp-table-size=10000 \
  9. --mysql-db=dbtest \
  10. --mysql-user=dbtest \
  11. --mysql-password=123456 \
  12. --oltp-tables-count=10 \
  13. --mysql-socket=/tmp/mysql.sock \
  14. prepare

运行收集测试数据的脚本 gather.sh

  1. # 创建脚本需要的目录
  2. mkdir /home/benchmarks && cd /home/benchmarks
  3. # 将gather.sh脚本放在上述目标,并创建running
  4. touch running
  5. # 后台运行
  6. sh gather.sh &

进行基准测试

  1. # 运行
  2. sysbench --test=./oltp.lua \
  3. --mysql-table-engine=innodb \
  4. --oltp-table-size=10000 \
  5. --mysql-db=dbtest \
  6. --mysql-user=dbtest \
  7. --mysql-password=123456 \
  8. --oltp-tables-count=10 \
  9. --mysql-socket=/tmp/mysql.sock \
  10. run

测试结束后,运行分析数据的脚本 analyze.sh

  1. # 查看获取的数据
  2. [root@mysql211 benchmarks]# ll -h 5*
  3. -rw-r--r--. 1 root root 124K Mar 12 16:41 5-sec-status-2018-03-12_04-innodbstatus
  4. -rw-r--r--. 1 root root 11K Mar 12 16:41 5-sec-status-2018-03-12_04-processlist
  5. -rw-r--r--. 1 root root 236K Mar 12 16:41 5-sec-status-2018-03-12_04-status
  6. # 分析这些数据 analyze.sh 文件名
  7. sh analyze.sh /home/benchmarks/5-sec-status-2018-03-12_04-innodbstatus

三、参考

  • 《高性能MySQL(第三版)》第二章

MySQL基准测试工具的更多相关文章

  1. mysql基准测试工具tpcc-mysql安装、使用、结果解读

    TPCC是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统,tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于My ...

  2. MySQL基准测试工具--sysbench

    我们需要知道的是sysbench并不是一个压力测试工具,是一个基准测试工具.linux自带的版本比较低,我们需要自己安装sysbench. [root@test2 ~]# sysbench --ver ...

  3. Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

    什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...

  4. 【mysql】mysql基准测试

    基准测试定义 基准测试其实是一种测量和评估软件性能指标的方法,用于建立某个时间点的性能基准,以便当系统的软硬件发生变化的时候重新进行基准测试以评估变化对性能的影响.所以对系统性能的测量,才能知道我们的 ...

  5. MySQL 基准测试

    这是<高性能 MySQL(第三版)>第二章的读书笔记. 基准测试(benchmark)是针对系统的压力测试,用于掌握系统行为或重新系统的某个状态.sysbench 是常用的 MySQL 基 ...

  6. 《打造扛得住的MySQL数据库架构》第3章 MySQL基准测试

    3-1 什么是基准测试 测量系统性能,优化是否有效?MySQL基准测试. 定义:基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件 变化时重新进行基准测试以评 ...

  7. 详解MySQL基准测试和sysbench工具

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  8. 详解MySQL基准测试和sysbench工具(转)

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  9. MySQL基准测试(三)--开源工具与实例演示

    MySQL基准测试(三)--开源工具与实例演示 针对web应用 ab ab是一个Apache HTTP服务的基准测试工具. http_load http_load是一个针对Web服务器测试工具. JM ...

随机推荐

  1. char的越界赋值即其原理剖析

    思考: int ch = 'A'; int ch1 = 65; int ch2 = 321; printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么 ...

  2. Numpy实现多项式曲线拟合

    Numpy实现多项式曲线拟合 这里可以对比matlab中的拟合方式看看matlab拟合函数的三种方法,和第一种方式很像 问题定义:对于一堆数据点(x, y),能否只根据这些数据,找出一个函数,使得函数 ...

  3. python根据日期判断星期几(超简洁)

    代码: from datetime import datetime def getWeek(week): print(date + "是星期" + str(week + 1)) d ...

  4. js判断是否为电话号码

    /* 用途:检查输入字符串是否符合国内固话或者传真格式 输入: s:字符串  格式例如:030-4557777返回: 如果通过验证返回true,否则返回false */ function isTel( ...

  5. java JDK的安装和环境配置(windows10)

    1.下载JDK,安装.http://www.oracle.com/technetwork/java/javase/archive-139210.html   下载地址 2.配置JDK. (右键我的电脑 ...

  6. 单位ren vw vh 和 vm

    px: (像素)就是一张图片最小的一个点 em :参考物是父元素的font-size,具有继承的特点 rem: 参考物是HTML的font-size

  7. 创建可以运行宿主机GPU的容器

    1.安装NVIDIA Container Runtime apt-get参考https://blog.csdn.net/li_ellin/article/details/107180516 yum参考 ...

  8. Metaspaloit漏洞利用

    Metaspaloit介绍Metaspaloit介绍 Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提 ...

  9. Python BeautifulSoup4 爬虫基础、多线程学习

    针对 崔庆才老师 的 https://ssr1.scrape.center 的爬虫基础练习.Threading多线程库.Time库.json库.BeautifulSoup4 爬虫库.py基本语法

  10. Mysql学习day1

    安装了Mysql以及SQLyog,将SQLyog和数据库做了连接. 学习了基础数据类型以及命令行语句 1 alter table `student` rename as `stu``lesson` 2 ...