获取系统性能和状态
在执行基准测试时需要尽可能多地收集被测试系统的信息最好为基准测试建立一个目录并且每执行一轮测试都创建单独的子目录将测试结果配置文件测试指标脚本和其他相关说明都保存在其中即使有些结果不是目前需要的也应该先保存下来多余一些数据总比缺乏重要的数据要好而且多余的数据以后也许会用得着需要记录的数据包括系统状态和性能指标诸如CPU 使用率磁盘I/O网络流量统计SHOWGLOBAL STATUS 计数器等
下面是一个收集MySQL 测试数据的shell 脚本
#!/bin/sh
INTERVAL=
PREFIX=$INTERVALsecstatus
RUNFILE=/home/benchmarks/running
mysql e SHOW GLOBAL VARIABLES 》 mysqlvariables
while test e $RUNFILE; do
file=$(date +%F_%I)
sleep=$(date +%s%N | awk {print $INTERVAL (\$ % $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
这个shell 脚本很简单但提供了一个有效的收集状态和性能数据的框架看起来好像作用不大但当需要在多个服务器上执行比较复杂的测试的时候要回答以下关于系统行为的问题没有这种脚本的话就会很困难了下面是这个脚本的一些要点
迭代是基于固定时间间隔的每隔 秒运行y 一次收集的动作注意这里sleep 的时间有一个特殊的技巧如果只是简单地在每次循环时插入一条sleep 的指令循环的执行间隔时间一般都会稍大于 秒那么这个脚本就没有办法通过其他脚本和图形简单地捕获时间相关的准确数据即使有时候循环能够恰好在 秒内完成但如果某些系统的时间戳是::另外一个则是::这时候就比较讨厌了当然这里的 秒也可以改成其他的时间间隔比如 或者 秒不过还是推荐使用 秒或者 秒的间隔来收集数据
每个文件名都包含了该轮测试开始的y 日期和小时如果测试要持续好几天那么这个文件可能会非常大有必要的话需要手工将文件移到其他地方但要分析全部结果的时候要注意从最早的文件开始如果只需要分析某个时间点的数据则可以根据文件名中的日期和小时迅速定位这比在一个GB 以上的大文件中去搜索要快捷得多
每次抓取数据都会先记录当前的时间戳所以可以在文件中搜索某个时间点的数据也可以写一些awk 或者sed 脚本来简化操作
这个脚本不会处理或者过滤收集到的数据先收集所有的原始数据然后再基于此做分析和过滤是一个好习惯如果在收集的时候对数据做了预处理而后续分析发现一些异常的地方需要用到更多的原始数据这时候就要抓瞎了
如果需要在测试完成后脚本自动退出只需要删除/home/benchmarks/running 文件即可
这只是一段简单的代码或许不能满足全部的需求但却很好地演示了该如何捕获测试的性能和状态数据从代码可以看出只捕获了MySQL 的部分数据如果需要则很容易通过修改脚本添加新的数据捕获例如可以通过ptdiskstats 工具注 捕获/proc/diskstats 的数据为后续分析磁盘I/O 使用
返回目录高性能MySQL
编辑推荐
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程
Oracle索引技术