第二章 MySQL基准测试
基准测试(benchmark)是MySQl新手和专家都需要掌握的一项基本技能。
2.1 为什么需要基准测试
为什么基准测试很重要?因为基准测试是唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。
基准测试可以完成很多工作:
- 验证基于系统的一些假设,确认这些假设是否符合实际情况
- 重现系统中的某些异常行为,以解决这些异常
- 测试系统当前的运行情况
- 模拟比当前系统更高的负载,以找出系统随着压力增加而可能遇到的扩展性瓶颈
- 规划未来的业务增长
- 测试应用适应可变环境的能力
- 测试不同硬件,软件和操作系统配置
- 证明新采购的设备配置是否正确
2.2 基准测试的策略
基准测试有两个主要的策略:
- 一是针对整个系统的整体测试
- 测试整个应用系统,包括Web服务器、应用代码、网络和数据库是非常有用的,因为用户关注的不仅仅是MySQL本身的性能,而是应用整体的性能。
- MySQL并非总是应用的瓶颈
- 只有对应用做整体测试,才能发现各部分直接的缓存带来的影响
- 整体应用的集成测试更能揭示应用的真实表现,而单独组件测试很难做到这一点。
- 另外是单独测试MySQL。
- 需要比较不同的schema或者查询性能
- 针对应用中某个具体问题的测试
- 为了避免漫长的基准测试,可以通过一个短期的基准测试,做快速的“周期循环”来检测出某些调整后的效果
2.2.1 测试何种指标
- 吞吐量:是指单位时间内的事务处理数,常用的测试单位是每秒事物数(TPS),有的地方也采用每分钟事务数(TPM)
- 响应时间或者延迟:这个指标用以测试任务所需的整体时间。
- 并发性
- 可扩展性
2.3 基准测试的方法
如何避免一些常见的错误:
- 使用真实数据的子集而不是全集
- 使用错误的数据分布
- 使用不真实的分布参数
- 使用错误的数据分布
- 在多用户场景下只做单用户的测试
- 在单服务器上测试分布式应用
- 与真实用户行为不匹配
- 反复执行同一个查询
- 没有检查错误
- 忽略了系统预热(wram up)的过程
- 使用默认的服务器配置
- 测试时间太短
2.3.1 设计和规划基准测试
- 提出问题并明确目标
- 选择合适的方案
- 迭代测试
- 针对数据运行查询
- 可以在不同级别记录查询
- 即使不需要创建专用的基准测试,详细的写下测试规划也是必需的
- 应该建立将参数和结果文档化的规范,每一轮测试都必须进行详细记录
2.3.2 基准测试应该运行多长时间
基准测试应该运行足够长的时间,这一点很重要。
2.3.3 获取系统性能和状态
需要记录的数据包括系统状态和性能指标,诸如CPU使用率,磁盘I/O、网络流量统计、SHOW GLOBAL STATUS计数器等
#!/bin/sh
INTERVAL = 5
PREFIX =$INTERVAL-sec-status
RUNFILE=/home/benchmarks/running
mysql -e 'SHOW GLOBAL VARIABLES' >> mysql-variables
while test -e $RUNABLE; do
file=$(date +%F_%I)
sleep=$(date+%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
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\G' >> $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 exist
2.3.4 获得准确的测试结果
- 获得准确基准测试结果的最好办法是回答一些关于基准测试的基本问题:
- 是否选择了正确等基准测试?
- 是否为问题收集了相关数据?
- 是否采用了错误等测试标准?
- 确认测试是否可以重复。每次测试之前要确保系统状态一致
- 每次测试中,修改的参数应尽可能少
- 另外基于MySQL的默认配置的测试没什么意义,因为默认配置是基于消耗很少内存的极小应用的。
- 最后,如果测试中出现异常结果,不要轻易当作坏数据点丢弃。应该认真研究并找到产生这种结果的原因
2.3.5 运行基准测试并分析结果
- 自动化
- 对结果进行分析
- 得出结果,回答设计测试时的问题
2.3.6 绘图的重要性
在执行基准测试的时候要尽可能的收集更多的细节数据,然后将数据绘制成图形,这样可以帮助快速的发现问题。
2.4 基准测试工具
2.4.1 集成式测试工具
已有的集成式测试工具:
- ab: 一个Apache HTTP 服务器基准测试工具。它可以测试http服务器每秒最多可以处理多少请求。
- http_load
- 和 ab类似,但是比ab灵活
- 可以在提供的URL中随机测试
- JMeter : 一个java应用程序,可以加载其他应用并测试性能。
2.4.2 单组件式测试工具
- mysqlslap
- MySQL Benchmark Suite(sql-bench)
- Super Smack
- Database Test Suite
- Percona’s TPCC-MySQL Tool
- sysbench