在做運維工作時,或多或少都會遇到通路出錯或緩慢問題,這裡以兩個小的例子來簡單說明下這類問題的troubleshooting的思路。
1.使用者查詢平台故障一例
查詢平台結構
nginx:80----------ip1/ip2 java------jdbc---(haproxy)--ip3(3000)+ip4(3000)hiveserver2---hdfs
從後端應用開始查:
1)通過hive cli運作sql,檢測hadoop運作job的狀态,正常。
2)由于應用使用jdbc的方式連接配接hiveserver2,使用beeline測試hiveserver2的狀态,正常。
連接配接方法:
1
<code>!connect jdbc:hive2:</code><code>/xxxx</code><code>:30000</code><code>/cdnlog</code>
3)檢視應用狀态,由于是java應用,是以第一時間使用jstat檢視下gc資訊。發現因為s0和old區100%導緻應用在做頻繁的full gc,定位到是存在記憶體洩露的問題,通過jmap列印相關堆棧資訊來進一步分析。
2
3
4
5
<code>jstat -gcutil 14266 1000 1000</code>
<code> </code><code>S0 S1 E O P YGC YGCT FGC FGCT GCT</code>
<code>100.00 0.00 100.00 100.00 21.65 596 77.267 629 2817.783 2895.050</code>
4)再來看nginx的通路日志,可以明顯看到nginx首先proxy到ip1,當響應逾時後再proxy到ip2,是以從日志中可以看到兩個status和upstream response time.
截取的一段日志:"8.999, 0.008" "ip1:8081, ip2:8081" "502, 200" "9.007"
存在的問題:
沒有有效的java監控(包括性能監控和日志監控)
2.推薦域名通路故障問題
故障現象:
使用者通路緩慢,一個url有時響應超過3s,并且會有一定的幾率abort.
域名整個的通路流程:
client-----cdn-----内部cdn節點-----源站(F5--nginx---java----redis---db)
從使用者端開始入手:
1)通過curl xxxx --trace-time --verbose來檢視通路時間的變化情況,單一請求時間3s,漸變點在使用者等待伺服器響應上
2)使用者與cdn伺服器連通性沒有問題(延遲5ms以内,無丢包),這點從client—cdn建立連接配接耗時也可以看出來(5ms)
3)源站nginx響應時間2ms,說明後端應用正常,源站到cdn節點延遲是50ms,無丢包,同時看到在cdn内部經過3多層代理,這就導緻cdn内部任何一層有問題都會産生慢速響應
4)調整cdn政策為一層代理,問題得到緩解不過還是有一定比例的慢速響應
5)跳過cdn節點,直接指向源站來進行通路測試,發現有一定的幾率abort
6)在client端通過tcpdump抓包,發現client---server連接配接建立正常,但是server端有一定的機率會傳回RST給client,造成abort的産生
<a href="http://s3.51cto.com/wyfs02/M02/23/EA/wKiom1NGuEbgevnLAAJRoh7dZ1A587.jpg" target="_blank"></a>
即使用者到F5正常,由F5到後端nginx出現問題,最終定位到是由于F5配置出錯導緻proxy到了錯誤的server上。
存在問題:
1)RST不會在伺服器上産生日志,是tcp層面的問題,還沒到應用層,是以通過監控nginx的通路日志無法發現這種問題,需要對client端的性能做監控
2)F5的配置有些問題,對于後面機器的檢測,隻是使用了ping的方法,沒有檢測端口導緻有一部分的請求會分發到有問題的機器(比較理想的請求使用url的應用層檢測)
小結:
對于這類問題,可以通過兩種方式來troubleshooting,從應用出發和從client端出發。
兩種方法的思路都是一樣的,首先要清楚的了解整個的通路鍊,然後對通路進行分解,對每一步都進行檢測分析。
同時要注意伺服器qos和使用者端qos的結合。
本文轉自菜菜光 51CTO部落格,原文連結:http://blog.51cto.com/caiguangguang/1393707,如需轉載請自行聯系原作者