基准测试(benchmarking)是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。
说简单点,就是针对系统设置的一种压力测试。测量系统性能,然后确保优化是否有效。
基准测试的目的:
对整个系统进行基准测试:
从系统入口进行测试(如网站Web前端,手机APP前端)
单独对MySQL进行基准测试
- 响应时间是整个测试完成后的时间;
- 并发量:同时处理的查询请求的数量(并发量不等于连接数)
- 并发量实际上正在工作中的并发的操作数或同时工作的数量
基准测试的步骤:
- 对整个系统还是某一组件
- 使用什么样的数据
- 实际情况:实际数据和实际运行的sql。利用生产环境的备份数据以及在一段时间产生的sql慢查日志运行多线程的回放来完成测试;如果是一个配置的测试(很小的修改)可以使用软件来完成
- 准备基准测试以及数据收集脚本
- 脚本自己编写(CPU使用率,IO,网络流量,状态与计数器信息等)
- 运行基准测试,多次测试
- 保存及分析基准测试结果
收集脚本:
#!/bin/bash
INTERVAL=5 运行间隔
PREFIX=/home/imooc/benchmarks/$INTERVAL-sec-status 保存位置
RUNFILE=/home/imooc/benchmarks/running 运行标识
echo "1" > $RUNFILE
MYSQL=/usr/local/mysql/bin/mysql 记录mysql位置
$MYSQL -e "show global variables" >> mysql-variables
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 & 收集mysql全集的状态信息
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
$MYSQL -e "show engine innodb status" >> $PREFIX-${file}-innodbstatus & 收集Innodb的状态信息
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
$MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist & 收集mysql的线程情况
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/{ 查询数量,QPS
printf fmt,($2-Queries)/diff;
Queries=$2
}
' "$@"
添加TPS,每秒插入量,删除量,更新量,并发量,线程量。。。。
基准测试工具:
mysqlslap:
sysbench:
./autogen.sh (unnecessary if you are building from a release tarball)
./configure (or ./configure --without-mysql to compile w/o MySQL support)
make
make install