MySQL的基准测试
基准测试:基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。直接、简单、用于评估服务器的处理能力。
基准测试的目的:
- 建立MySQL服务器的性能基准线
- 确定当前MySQL服务器运行的情况
- 模拟比当前系统更高的负载,以找出系统的扩展的瓶颈增加数据库的开发,观察QPS和TPS的变化
- 测试不同的硬件、软件和操作系统配置
- 证明新的硬件设备是否配置正确
如何进行基准测试:
- 对整个系统进行基准测试
- 单独对一个组件进行基准测试
MySQL进行性能的基准测试:
- 单位时间内所处理的事务数(TPS)
- 单位时间内索处理的查询数(QPS)
- 响应时间(平均响应时间、最小响应时间、最大响应时间、各时间所占的百分比)
- 并发量:同时处理的查询请求的数量(正在工作中的并发的操作数或者同时工作的数量)
基准测试的步骤:
- 对整个系统还是对一个组件
- 使用什么样的数据
准备基准测试及数据收集的脚本(cpu的使用率、IO、网络流量、状态与计数器的信息等)
实例脚本:#!/bin/bash INTERVAL=5 #每隔多长时间收集一次信息 PREFIX=/home/imooc/benchmarks/$INTERVAL-sec-status #收集的位置 RUNFILE=/home/imooc/benchmarks/running #运行标识 echo "1" > $RUNFILE MYSQL=/usr/bin/mysql #mysql的位置 $MYSQL -e "show global variables" >> mysql-variables #mysql的配置的信息 while test -e $RUNFILE; do #循环打印出需要的数据 file=$(date +%F_%I) sleep=$(date +%s.%N | awk '{print 5 - ($1 % 5)}') sleep $sleep ts="$(date +"TS %s.%N %F %T")" loadavg="$(uptime)" echo "$ts $loadavg" >> $PREFIX-${file}-status $MYSQL -e "show global status" >> $PREFIX-${file}-status & echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus $MYSQL -e "show engine innodb status" >> $PREFIX-${file}-innodbstatus & echo "$ts $loadavg" >> $PREFIX-${file}-processlist $MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist & echo $ts done echo Exiting because $RUNFILE does not exists复制代码
- 运行基准测试
保存及分析基准测试结果
#!/bin/bash awk ' BEGIN { printf "#ts date time load QPS"; fmt=" %.2f"; } /^TS/ { ts = substr($2,1,index($2,".")-1); load = NF -2; diff = ts - prev_ts; printf "\n%s %s %s %s",ts,$3,$4,substr($load,1,length($load)-1); prev_ts=ts; } /Queries/{ printf fmt,($2-Queries)/diff; Queries=$2 } ' "$@"复制代码
注意的问题:
- 使用生产环境数据时只使用了部分的数据
- 在多用户场景中,只做了单用户的测试(建议:使用多线程的并发测试)
- 在单服务上测试分布式应用(使用相同的架构进行测试)
- 反复的执行同一个查询
Mysql基准测试工具
mysql自带的基准测试工具mysqlslap
常用的参数:
--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 指定测试运行的次数
--number-of-queries 指定每一个线程执行的查询的数量
--debug-info 指定输出额外的内存及cpu的信息
--number-int-cols 指定测试表中包含的int类型列的数量
--number-char-cols 指定测试表中包含的varchar类型列的数量
--create-schema 指定了用于执行测试的数据库的名字
--query 用于指定自定义SQL的脚本
--only-print 并不运行测试,而是把生成的脚本打印出来
mysqlslap -uroot -proot --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=test --only-print
mysql自带的基准测试工具sysbench
安装:
./autogen.sh ./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib make && make install复制代码
常用的参数:
--test 用于指定要测试的测试的类型,支持以下的参数 Fileio 文件系统I/O性能的测试 cpu cpu性能的测试 memory 内存性能的测试 Oltp 测试要指定具体的lua脚本(0.5版本之后不支持了) Lua脚本位于sysbench-0.5/sysbench/tests/db --mysql-db 用于指定基准测试的数据库名 --mysql-table-engine 有鬼指定所使用的存储引擎 --oltp-table-count 指定测试表的数量 --oltp-table-size 指定每个表中数据的数据行数 --num-threads 指定测试的并发的线程数量 --max-time 指定最大的测试时间 --report-interval 指定间隔多长时间输出一次统计信息 --mysql-user 指定执行测试的MySQL用户 --mysql-password指定测试的MySQL用户的密码 prepare 用于准备测试数据 run 用于实际进行测试 cleanup 用于清理测试数据复制代码
测试cpu性能:
sysbench --test=cpu --cpu-max-prime=10000 run
测试IO性能:
sysbench --test=fileio --file-total-size=1G prepare
sysbench --test=Fileio --num-threads=8 --init-rng=on --file-total-size=1G --file-test-mode=rndrw --report-interval=1 run
grant all privileges on . to sbtest@'localhost' identified by '123456';
sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=tests --mysql-user=sbtest --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/usr/local/mysql/data/mysql.sock prepare
sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=tests --mysql-user=sbtest --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/usr/local/mysql/data/mysql.sock run