笨法算RPS

赞助

如果你觉得我写得还行,并且愿意付费,那么我会更有动力写下去。

计算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"

最终生成的效果图大致如下所示:

RPS

RPS

看图可知,LUA接口的访问量波峰大致在晚上六点和凌晨零点,而PHP的访问量波峰大致在晚上十点左右,两者的访问量波谷基本都是在凌晨四五点左右。

笨法算RPS》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注