计算rps的最简单方法是将一天的总访问量除以一天的总秒数,但这只能得到一个平均值,无法反映各个时间点的真实情况。真正有价值的是即时rps数据。如果有一个好的监控系统,这并不难实现,但遗憾的是我没有这样的系统。实际上,我遇到的问题更加复杂:大部分接口是用php编写的,少部分是用lua编写的,因此需要分别计算php和lua的即时rps数据。
假设Web日志已经按天分割,如果你不知道如何操作,可以参考我之前写的文章「被遗忘的Logrotate」。日志格式如下所示:
1.2.3.4 - - [25/Jul/2013:00:01:01 +0800] "GET /url HTTP/1.1" ...
从日志格式来看,第四个字段是时间,第七个字段是网址。有了这些信息,我们可以使用AWK来计算LUA和PHP的即时RPS大小。如果你读过我之前的文章,应该记得我在「devops的三板斧」一文中提到了一个类似的案例。不过,本文的问题更为复杂,因此我还是要详细解释一下。代码如下:
#!/usr/bin/awk -f function rps(data, file) { COMMAND = "sort -o " file for(time in data) { print time, "t", data[time] | COMMAND } close(COMMAND) } { URL = $7 TIME = substr($4, 14) } URL ~ /^/foo/lua/ { LUA[TIME]++; next } URL ~ /^/bar/lua/ { LUA[TIME]++; next } { PHP[TIME]++ } END { rps(LUA, "LUA.log") rps(PHP, "PHP.log") }
注意:在通过管道对AWK中的无序数组进行排序后,需要关闭管道。
计算得到的RPS文本数据格式大致如下:
00:00:00 115 00:00:01 85 00:00:02 95 00:00:03 85 00:00:04 90 00:00:05 87
接下来,我们使用Gnuplot将这些数据可视化:
#!/usr/bin/gnuplot set terminal png size 500,400 set grid set xdata time set timefmt "%H:%M:%S" set format x '%H' set xlabel "Time" set ylabel "RPS" set output "rps.png" plot "LUA.log" using 1:2 with line title "LUA", "PHP.log" using 1:2 with line title "PHP"
最终生成的效果图如下:
从图中可以看出,LUA接口的访问量高峰大致在晚上六点和凌晨零点,而PHP的访问量高峰大致在晚上十点左右,两者的访问量低谷基本都在凌晨四五点左右。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END