用awk和gnuplot绘制曲线图
毋庸置疑,图像比文字更有力量。
譬如,将特定请求的QPS变化量绘制成曲线,对照CPU、IO、MEMORY曲线,对定位问题非常有帮助。
那么,从数据到图像有两部:
- 生成数据
绘制图像
awk 统计数据
1.awk 脚本 (calc_query_consum)
这里不方便贴出示例日志。该脚本按分统计 总耗时/访问量/平均耗时,稍作修改,可以改为按 时间+请求(将时间+请求作为数组下标)来统计。
# 这里定义了分隔符,分隔符是正则表达式
BEGIN { FS = "[,=/]" }
{
# 时间格式是[2017-10-15 23:59:59],这里将时间split到数组中
# 从而可以统计不同时段的请求数量,譬如可以按秒、分统计。
split($1, times, "[: ]")
# timesplit by second
# query_timestamp = times[2]":"times[3]":"times[4]
# timesplit by minute
query_timestamp = times[2]":"times[3]
query_exec_time = $7
timespit_ts_arr[query_timestamp] += query_exec_time
timespit_query_arr[query_timestamp] += 1
}
END {
# 收集完数据后,遍历数组输出结果
for (timestamp_key in timespit_ts_arr) {
total_ts = timespit_ts_arr[timestamp_key]
total_query = timespit_query_arr[timestamp_key]
avg_query_exec_time = total_ts / total_query
print timestamp_key, "timespit_total_ts", timespit_ts_arr[timestamp_key], "timespit_query_num", total_query, "timespit_avg_query_exec_time", avg_query_exec_time
}
}
usage
cat xxxxx_2017-10-14.log | awk -f calc_query_consum | sort -k1 > 10_14_minute_result
输出样例
00:00 timespit_total_ts 0.00681901 timespit_query_num 1 timespit_avg_query_exec_time 0.00681901
04:48 timespit_total_ts 2.58988 timespit_query_num 243 timespit_avg_query_exec_time 0.010658
04:49 timespit_total_ts 5.11569 timespit_query_num 244 timespit_avg_query_exec_time 0.020966
04:50 timespit_total_ts 3.64235 timespit_query_num 315 timespit_avg_query_exec_time 0.011563
04:51 timespit_total_ts 3.44781 timespit_query_num 305 timespit_avg_query_exec_time 0.0113043
04:52 timespit_total_ts 3.54635 timespit_query_num 288 timespit_avg_query_exec_time 0.0123137
04:53 timespit_total_ts 4.00858 timespit_query_num 331 timespit_avg_query_exec_time 0.0121105
2.gnuplot 绘图
可以通过apt-get安装
enjolras@dingxinglong-debian8:~/Desktop$ gnuplot
gnuplot> set xdata time
gnuplot> set timefmt "%H:%M"
gnuplot> set format x "%H:%M"
# 下面的命令,将16:00->23:59 时间作为X轴,第3列,总执行时间作为Y轴作图。
gnuplot> plot ["16:00":"23:59"] '10_14_minute_result' using 1:3 with linespoints
多条曲线示例
plot ["16:00":"23:59"] '10_14_minute_result' using 1:3 title "total_time" with lines, '10_14_minute_result' using 1:5 title "avg_time" with lines