DevOps的三板斧
話說這些天電視上正在熱映《隋唐英雄》,雖然我并沒有看,但是對當(dāng)年田連元老先生的評書聯(lián)播《隋唐演義》卻是記憶猶新,特別是故事里面講到的程咬金的三板斧:拍蒜瓣、戳腳指甲蓋、胡椒面,每每聽來總是讓人忍俊不禁,不過這些貌似無厘頭的招數(shù)在實(shí)戰(zhàn)中卻往往有出奇制勝的效果,由此可以見簡單實(shí)用永遠(yuǎn)都是硬道理,在當(dāng)前這個倡導(dǎo)DevOps的年代,我們這些程序員自然也要學(xué)一些運(yùn)維方面的本事才好安身立命,下面結(jié)合一些真實(shí)案例說說我在日常工作中常用的三板斧。
第一板斧:AWK
Web服務(wù)器負(fù)載飆升,猜測是訪問量激增造成的,如何驗證?如果有監(jiān)控,這自然不是什么難事,但如果沒有呢?亦或者監(jiān)控不能顯示即使數(shù)據(jù),此時如何是好?
前提:日志已經(jīng)通過logrotate按天切分,其內(nèi)容類似下面的樣子:
- 123.123.123.123 - - [01/Jan/2013:00:01:01 +0800] "GET /path HTTP/1.1" 200 123 "-" "Mozilla"
利用AWK,我們可以很方便的計算一天中每分鐘的訪問量是多少:
- shell> awk -F: '{ count[$2":"$3]++ } END { for (minute in count) print minute, count[minute] }' /path/to/log | sort > count.log
下面列出生成的count.log文件中的部分?jǐn)?shù)據(jù),結(jié)果一目了然,不多說了:
- 18:55 14450
- 18:56 14926
- 18:57 15645
- 18:58 16678
- 18:59 19032
- 19:00 29134
- 19:01 34665
- 19:02 35558
- 19:03 35545
- 19:04 35829
- 19:05 35608
如果想要以秒為單位來統(tǒng)計,很是類似的方法,這里就不多說了。
第二板斧:Strace
程序運(yùn)行很慢,我們?nèi)绾沃赖降茁谀模看藭r可以利用strace的「r」選項,不過需要注意的是,strace的結(jié)果在標(biāo)準(zhǔn)錯誤里,使用前最好重定向到標(biāo)準(zhǔn)輸出。
下面讓我們過濾某個PHP進(jìn)程中操作時間大于0.001秒的操作:
- shell> strace -rp <PID> 2>&1 | awk '$1 > 0.001'
- 0.001596 lstat64("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
如果問題比較簡單,通常這樣就夠了,但如果問題相對復(fù)雜,那么我們僅僅過濾出耗時的操作是不夠的,最好附上完整的上下文,此時如果用AWK來做的話,代碼會變得很復(fù)雜,別忘了我們還有g(shù)rep,通過它的「A」和「B」選項可以很方便的保存上下文,此外利用它的正則功能,可以模擬判斷時間的大小。
下面讓我們過濾某個PHP進(jìn)程中操作時間大于0.001秒的操作,并附上前后兩行上下文:
- shell> strace -rp <PID> 2>&1 | grep -E '^[ ]*([1-9]|0\.[1-9]|0\.0[1-9]|0\.00[1-9])' -A 2 -B 2
- 0.000081 getcwd("/var/www/script", 4096) = 32
- 0.000805 lstat64("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
- 0.001596 lstat64("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
- 0.000105 lstat64("/var/www/script", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
- 0.000112 lstat64("/var/www/script/test.php", {st_mode=S_IFREG|0644, st_size=4096, ...}) = 0
補(bǔ)充:本例中使用的是PHP程序,之所以會出現(xiàn)一堆lstat64操作是因為PHP配置中沒有設(shè)定合適的realpath_cache_size,具體就不多說了,大家自行查閱相關(guān)資料。
第三板斧:Gnuplot
數(shù)字總是蒼白的,不如圖形來得直觀,Gnuplot在繪圖方面非常簡單,就拿文章開頭統(tǒng)計訪問量的例子來說,以count.log為數(shù)據(jù)源,代碼大致如下:
- #!/usr/bin/gnuplot
- set terminal png size 500,400
- set grid
- set xdata time
- set timefmt "%H:%M"
- set format x '%H'
- set xlabel "Time"
- set ylabel "Count"
- set output "count.png"
- plot "count.log" using 1:2 with line notitle
還支持利用多份兒數(shù)據(jù)畫多條線,這樣更方便對比歷史數(shù)據(jù):
- plot "count1.log" using 1:2 with line title "1st", \
- "count2.log" using 1:2 with line title "2nd"
最終生成的圖形是不是比數(shù)字直觀多了:
—Gnuplot繪圖
有了Gnuplot,我們甚至可以通過CRON之類的方式打造簡易的圖形化監(jiān)控系統(tǒng)。
…
DevOps代表著未開軟件開發(fā)的方向,它倡導(dǎo)小團(tuán)隊,強(qiáng)調(diào)單兵作戰(zhàn)能力,此時的程序員作為團(tuán)隊中的一員,已經(jīng)不能再僅僅局限于開發(fā)的角色,必須在運(yùn)維方面武裝自己,希望大家都能有自己的三板斧,當(dāng)然我們可不是古惑仔,而是程咬金。