最近電視上正在熱播《隋唐英雄》,雖然我沒有觀看,但田連元老先生的評書《隋唐演義》卻讓我記憶猶新。特別是其中程咬金的三板斧——拍蒜瓣、戳腳指甲蓋、撒胡椒面——每次聽來都讓人忍俊不禁。這些看似荒謬的招數在實戰中卻常常能出其不意,取得勝利,這說明簡單實用才是制勝的法寶。在當今倡導devops的時代,我們這些程序員也應該掌握一些運維技能以求立足。下面我將結合實際案例,分享我在日常工作中常用的三板斧。
第一板斧:AWK
當Web服務器的負載突然飆升時,我們可能會懷疑是訪問量激增所致。如何驗證這一猜測呢?如果有監控系統,這自然不是難題,但如果沒有監控,或者監控無法實時顯示數據,該怎么辦?
假設日志已經通過logrotate按天切分,其內容如下:
1.2.3.4 - - [01/Jan/2013:00:01:01 +0800] "GET /path HTTP/1.1" ...
利用AWK,我們可以輕松計算一天中每分鐘的訪問量:
shell> awk -F: ' { count[$2":"$3]++ } END { for (minute in count) print minute, count[minute] }' /path/to/log | sort > count.log
生成的count.log文件中的部分數據如下,結果一目了然:
18:55 1445018:56 1492618:57 1564518:58 1667818:59 1903219:00 2913419:01 3466519:02 3555819:03 3554519:04 3582919:05 35608
如果需要按秒統計,方法類似,這里就不贅述了。
第二板斧:Strace
當程序運行緩慢時,我們如何確定瓶頸所在?此時可以使用strace的「-T」選項,但需要注意,strace的結果輸出到標準錯誤,需要重定向到標準輸出。
讓我們過濾某個php進程中操作時間超過0.001秒的操作:
shell> strace -T -p <pid> 2>&1 | awk 'substr($NF, 2, 8) > 0.001'lstat64("/var/www", {...}) = 0 </pid>
如果問題簡單,這通常就足夠了。但如果問題復雜,僅過濾耗時操作是不夠的,最好能看到完整的上下文。AWK在這方面的代碼會變得復雜,但我們還有grep,它的「A」和「B」選項可以方便地保存上下文,同時利用正則表達式可以模擬時間大小判斷。
讓我們過濾某個PHP進程中操作時間超過0.001秒的操作,并附上前后兩行的上下文:
shell> strace -T -p <pid> 2>&1 | grep -E -A 2 -B 2 'lstat64("/var", {...}) = 0 lstat64("/var/www", {...}) = 0 lstat64("/var/www/script", {...}) = 0 lstat64("/var/www/script/test.php", {...}) = 0 </pid>
補充說明:本例中使用的是PHP程序,出現大量lstat64操作是因為PHP配置中沒有設置合適的realpath_cache_size,具體細節請自行查閱相關資料。
第三板斧:Gnuplot
數字總是枯燥的,圖形則更加直觀。Gnuplot在繪圖方面非常簡便,以文章開頭統計訪問量的例子為數據源,代碼如下:
#!/usr/bin/gnuplotset terminal png size 500,400set gridset xdata timeset 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
生成的圖形比數字更加直觀:
Gnuplot繪圖
有了Gnuplot,我們甚至可以通過CRON等方式構建一個簡單的圖形化監控系統。
…
DevOps代表著未來軟件開發的方向,它倡導小團隊,強調單兵作戰能力。在這樣的環境中,程序員作為團隊的一員,不能僅限于開發角色,還必須在運維方面武裝自己。希望大家都能找到自己的三板斧,當然,我們不是古惑仔,而是程咬金。