計算rps的最簡單方法是將一天的總訪問量除以一天的總秒數(shù),但這只能得到一個平均值,無法反映各個時間點的真實情況。真正有價值的是即時rps數(shù)據(jù)。如果有一個好的監(jiān)控系統(tǒng),這并不難實現(xiàn),但遺憾的是我沒有這樣的系統(tǒng)。實際上,我遇到的問題更加復(fù)雜:大部分接口是用php編寫的,少部分是用lua編寫的,因此需要分別計算php和lua的即時rps數(shù)據(jù)。
假設(shè)Web日志已經(jīng)按天分割,如果你不知道如何操作,可以參考我之前寫的文章「被遺忘的Logrotate」。日志格式如下所示:
1.2.3.4 - - [25/Jul/2013:00:01:01 +0800] "GET /url HTTP/1.1" ...
從日志格式來看,第四個字段是時間,第七個字段是網(wǎng)址。有了這些信息,我們可以使用AWK來計算LUA和PHP的即時RPS大小。如果你讀過我之前的文章,應(yīng)該記得我在「devops的三板斧」一文中提到了一個類似的案例。不過,本文的問題更為復(fù)雜,因此我還是要詳細解釋一下。代碼如下:
#!/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中的無序數(shù)組進行排序后,需要關(guān)閉管道。
計算得到的RPS文本數(shù)據(jù)格式大致如下:
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將這些數(shù)據(jù)可視化:
#!/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的訪問量高峰大致在晚上十點左右,兩者的訪問量低谷基本都在凌晨四五點左右。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END