引言
業務中斷了!
老板咆哮,主管抓狂,而你就是那個要去處理故障、恢復業務的不幸的人。
你獨自一人在陰暗的隔間里。
北邊是老板的辦公室,西邊是Team Leader的辦公室,南面是茶水間,在那你能泡上一杯熱咖啡。
問題沒有一點進展,你郁悶地盯着顯示器。
這時,電話再次響起,你不用接聽也已知道又是一通抱怨用戶連接不上服務器的電話,
因為就在半小時內,已經有四通電話催問你進展了。
你將會怎么做?泡一杯咖啡准備通宵苦戰?此時,或許你的心底也充滿無奈:
Linux服務器上部署的業務出現中斷時,為快速處理問題、消除故障,避免以上苦逼的劇情發生,我們可以做哪些准備嗎?
工欲善其事,必先利其器
Linux自身以及開源社區已經提供了很多工具,幫助我們快速定位問題。我們需要做的,就是在故障發生之前,確保機器上安裝了這些工具,並進行適當的配置,使其正常運轉,下面列舉幾個常用的問題診斷工具。
syslog/syslog-ng 記錄系統服務進程和操作系統本身的日志,我們可以對日志輸出的內容、輸出到哪些文件進行配置,利用這些日志,可以查到諸如機器重啟時間、命令執行記錄等信息,查看/var/log/messages里記錄的一些異常信息,往往是我們處理問題的第一步。
strace 跟蹤進程運行過程中產生的系統調用,當程序、命令執行掛死或緩慢時,我們可以通過分析相關系統調用信息,縮小問題范圍、查找故障原因。
atop 通過定時采樣系統資源使用情況、進程運行狀態,為我們提供了較全面的操作系統信息。
LKCD/kdump 是一種內核轉儲機制,當系統發生kernel crash時,它將寄存器中的值、內存中的堆棧信息保存到磁盤中,形成的vmcore文件提供了crash時間點所有進程的狀態、內存的使用情況等信息,根據寄存器的值,我們甚至能找到內核中相應的代碼進行分析。
除以上所列,ping、ps、lsof、dmesg等查詢命令也被經常用到。
現在,我們面前擺放着各式各樣、功能不同的工具,有了這么一個強大的工具套件,是否意味着來一個問題我們就能解決一個,來兩個問題我們就能消滅一雙呢?
非也。僅僅擁有齊備的問題診斷工具是遠遠不夠的,更需要我們掌握怎么使用(How)以及什么時候(When)使用這些工具、熟悉Linux操作系統本身,甚至需要深入了解Linux內核源碼。是否能解決、快速解決Linux故障問題,取決於問題處理人員的技能水平。
問題處理與個人能力提升
當故障發生時,盡早恢復業務固然重要,但對個人而言,恢復業務並不是目的,更多地是通過處理問題過程提升自己的技能。進行Linux服務器相關故障處理的時,我們需要考量以下幾方面:
- 快速解決問題
- 提升自身技能
- 向高人求助
某年某月某日,一個系統啟動過程中掛死的問題需要你處理,這時恰好你身邊就有一位Linux專家,他對系統啟動過程了如指掌。這時你有兩種選擇:
1. 問Linux專家,問題立馬可以得到解決
2. 查閱相關資料,自己解決問題
如果你嘗試依靠自己的能力解決該問題,或許你需要花費很多時間和精力,查閱很多介紹Linux操作系統啟動過程的資料,但因此你也了解了各個啟動階段的功能、對應加載的服務項,甚至能學到在不同啟動階段掛死的恢復處理方法。
相比直接使用google搜索答案或問相應專家,獨立解決問題,即使問題最終沒能靠自身力量得到解決,但學習和獨立思考的過程也讓自身的技能得到了提升。
但也並非所有問題都有必要作深入研究,當問題屬於以下類型:
- 十分緊急,稍有延誤就會帶來重大損失
- 非自身發展領域相關
那我們不妨采取另一種策略,google之,或找相關領域的專家迅速地將問題解決。
問題處理參考方法
現在你手頭有很多可用於問題診斷的工具,你也認識到可以通過獨立處理問題,來提升自身技能,接下來就真正進入問題處理環節咯,具體怎么進行問題處理呢?
首先我們需要收集問題相關的信息:
1.問題現象
處理問題之前,首先得了解清楚問題現象。
業務出現異常,是響應慢還是完全沒有響應?
主機僵死,能否ping通?能否進行終端切換?是crash還是hang?
2.發生時間
如果問題發生的時間有一定規律,這時我們可以通過排查系統的定時任務,從而找出問題根因;另外,根據時間點我們可以迅速找到相關日志,減少查找日志花費的時間。
3.做過哪些操作
安裝了補丁包?修改了系統配置參數?了解問題出現之前做了什么操作,能為我們處理問題提供指引。
4.OS相關信息
利用工具可收集問題出現時間點CPU負載、內存利用、磁盤IO、網絡收發包等OS信息,這些信息為我們提供了較為全面的參考。
為了全面地收集OS信息,需要執行很多命令。這時,可以將這些命令集合到一個腳本中,利用腳本進行信息收集,節省了輸入命令的時間,對於無法自行登錄的遠程服務器,使用腳本收集更顯便捷。
總之,信息收集越全越好。即使自己找不出問題根因,后續向他人求助時,也不會因為缺少日志信息而犯愁。
了解了問題現象,又有了日志信息,那我們就可以結合日志對問題進行分析了。
首先判別問題類型、縮小問題范圍:
是硬件問題,還是軟件問題?
是業務進程層面的,還是系統層面的?
CPU、內存、網絡、磁盤,哪一方面出現異常?
對於可復現(reproducible)的問題,我們可搭建環境進行問題復現,在實驗環境中對問題處理方法進行驗證,可降低對現網環境的影響;對於復雜地、不可復現的問題,我們就得做好長期作戰的准備了,除了收集以上所列信息外,還需記錄問題處理的過程、嘗試過哪些處理方法等,這樣,當有其他人參與進來一同處理該問題的時候,就能更快速地熟悉問題情況。
小結
本文討論了Linux故障處理的方式方法。能否順利解決故障,首先取決於我們的技能水平,其次需要依靠各種問題診斷工具。處理問題的過程可以與個人技能提升很好地結合起來,好的處理方式需要經驗的積累,但個中也有規律可尋。
從提升個人技能的角度出發,即使面對緊急問題,我們也能變得更加淡定和坦然。再有業務中斷情況,老板、主管都還在抓狂,但你...
Reference: Self-Service Linux