1. 程式人生 > >線上問題排查的四類方法

線上問題排查的四類方法

最正統的方法

日誌

        這是排查問題的最常用的方法,需要預估自己每日日誌量和需要儲存的日誌時間。申請磁碟空間時一般會留35%的冗餘以備突發流量。

        一般需要打日誌的有:每個對外提供方法的入口和出口,呼叫第三方的呼叫前和呼叫後。列印內容主要包括入參和出參。https://github.com/xiexiaojing/concise-logger 我在簡明日誌規範裡定義:幾種常用的類裡用切面的形式注入日誌。

 

監控

        傳統的方法如果JVM出現gc等問題需要先開啟gc日誌,這會犧牲一些效率。但是現在業界已經普遍將這些資料上報到系統中,比如歐美常用的prometheus,國內用小米的falcon比較多。

        對於資料庫、呼叫量、響應時長等監控系統也都有統計。美團點評的CAT不僅集成了這些,還集成了依賴分析、依賴分析、心跳報表、業務大盤等。挺方便的。

 

報警

        報警不僅可以發現問題,還可以將發生問題時已經執行到的階段作為報警資訊一起發出,便於快速定位。

 

linux命令

tcpdump

    如果收到不明資料,又不知道資料從哪裡來的,最簡單的方法就是tcpdump進行抓包分析,確定資料來源。

 

netstat

    通常用來監聽連線埠的狀態。常見的狀態主要有:

  1. listen狀態:正在監聽來自遠方的TCP埠的連結請求。

  2. syn-sent狀態:在傳送連結請求後等待匹配的連線請求。

  3. syn-received狀態:在收到和傳送一個連結請求後等待對方對連結請求的確認。

  4. established狀態:代表一個開啟的連結。

  5. fin-wait-1狀態:等待遠端tcp連線中斷請求,或先前的連結中斷請求的確認。

  6. fin-wait-2狀態:從遠端tcp等待連結中斷請求。

  7. close-wait狀態:等待從本地使用者發來的連結中斷請求。

  8. closing狀態:等待遠端tcp對連結中斷的確認。

  9. last-ack狀態:等待原來的發現遠端tcp的連結中斷請求的確認。

  10. tie-wait狀態:等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認。

  11. closed狀態:沒有任何連線狀態。

 

再現

我無數次的假裝路過,只是為了與你一次偶然的邂逅……
這句話用到希望復現線上問題時,往往描述到位的想哭。
如果線上執行的程式遇到問題需要排查,建議優先使用最正統的方法,不行的話linux命令也可以接受。記憶體洩漏、併發問題等的再現成本很高。並且極其不利用快速恢復。

 

線上除錯

如果再現之後還不不能確定問題的原因,還有最後一招不到萬不得已不要用:線上除錯。

工具:線上機器是linux系統,本地intelij

 

複製下面的資訊

在線上啟動引數中加上上面資訊,重啟。

sudo svc -du /service/XXXX/

看看監聽埠有沒有起來

lsof -i :8083

起來後,本地inteij開啟遠端debug即可。記得之前有次線上事故就是有個小哥在線上開啟遠端debug,請求打到斷點卡在那裡了。
總結

事實、資料、推論、猜測

 

推薦閱讀

專案改進的四個抓手

技術境界的二三四

工作中常見的五種技術lea