1. 程式人生 > >解決問題方法論,技術人都應該學習的troubleshooting

解決問題方法論,技術人都應該學習的troubleshooting

troubleshooting

什麼是 troubleshooting?

troubleshooting 是找到問題發生的根源並將其解決更正的過程,troubleshooting 的目標就是使裝置 / 系統回到正常的工作狀態。

因為很多系統,特別是 IT 系統或者一些電力系統、通訊系統,都是 7×24 小時不間斷執行的。如果一旦發生故障,就要求我們運維人員很快的發現故障,然後用快速和經濟的辦法去把這個故障解決掉。比如醫院有些支撐手術的系統,一旦故障如果不能很快解決的話,甚至會威脅到病人的生命安全。所以 troubleshooting 對我們運維人員來說是一項非常重要的技能和技術要求。

不僅在工作中需要做 troubleshooting,生活中也會遇到。前段時間我跟著朋友在玩王者榮耀,就遇到了一個故障。每天晚上玩這個遊戲大概 8、9 點鐘就遇到打著打著網路質量變差,操作變得很卡。我很苦惱,作為一個運維人員,或者一個技術人員的本能,我就想網路是什麼問題?怎麼把它解決掉?所以我就做了一次 troubleshooting 的過程。我對家裡所有的無線網路,聯通的寬頻做了一些測試,嘗試對無線路由器做了配置優化,最後定位到是我們家和鄰居附近 2.4G 通道太擁擠了,干擾太嚴重,所以晚高峰的時候大家都有上網需求,會互相干擾。後來我把通道切換到 5G,世界就清靜了,可以安心打遊戲了。

解決問題的通用方法

後來我就思考,有沒有非常科學和規範的流程或方法,按照這個方法一步步做下來,就可以解決任何故障或問題?儘管問題多種多樣,實際問題解決的方式也是多種多樣,對於具體場景和問題,可以制定特定的問題解決流程。在具體的工作中,大家有做 SA 的,也有做網路的,也有做 DBA 的,每一個特定的方向都會有一些跟專業和問題場景相關的 troubleshooting 方法。

對於通用的問題,是否會有通用的解決方法和解決步驟可以遵循呢?

這是 《troubleshooting and maintaining cisco IP network》 這本書的作者總結的一套相對一個通用的方法。他把 troubleshooting 整個過程分成了 7 個步驟,從定義問題,到收集線索和資訊,到分析、假設、排除可能性,最終可以把問題解決掉。

在一些複雜的系統或複雜問題的 troubleshooting 中,我們可以按照這個解決方法的流程對問題去做一些抽象和定義,然後一步一步來解決。

具體策略與技巧

在這個標準流程和方法之外,我們可能會遇到一些相對簡單或者更直觀的問題,可以使用一些具體的策略和小技巧來更快速的 troubleshooting。

排查先決條件

我們經常會遇到電視按了開關怎麼沒反應?電腦怎麼開不了了?這個問題有非常大的可能性是電源沒插,或者停電了。從這個事情引申出來,任何系統執行都需要一些必要的前提條件,或者叫先決條件。在系統或服務發生異常的時候,需要回過頭來了解一下這個系統有哪些依賴關係,有哪些先決的條件,這些條件是不是之前是存在和正常的,現在條件不滿足了,所以發生了一些故障。

比如說摩托車在行駛過程中不走了,是不是沒油了?在一些非常成熟或者產品化做得非常好的產品,比如說 iphone 手機,它的使用者手冊裡會列出正常執行的條件,以及要遠離哪些條件,比如高溫、低溫等,會做一個非常明確的定義。

但是在一些自研系統的運維過程中,這些系統往往文件和說明並不是特別完善,所以先決條件需要根據系統的異常或者問題去做一些排查,另外也需要跟研發人員,或者是設計人員做一些深入的溝通,找到系統的一些先決條件,然後作為一個排查的線索去進行排查。這是第一個很基本的 troubleshooting 方法。每一個人都解決過類似的問題,大多數的問題往往是很普通的原因造成的,而我們的經驗和直覺可以幫助解決。

最精簡系統

我們進入下一個問題解決的策略,大家都有裝過電腦的經驗嗎?一套計算機系統有很多部件,比如 CPU、記憶體、電源、機箱、顯示器、光碟機、滑鼠、音響、網絡卡,等等。我們在裝機的時候並不是需要一次性全部裝好,往往是把電源,主機板、CPU、記憶體裝好後,就可以試試這套系統能不能正常工作。如果這個系統能亮,說明這套系統最重要的部件是 OK 的。所以從 troubleshooting 的角度,在做故障定位的時候,可以嘗試把一個非常複雜,功能和元件非常多的系統,精簡到最基本的系統,測試沒問題後,再一件一件把其他的系統元件加進來,這樣就可以事半功倍的把這個問題找到並解決掉。

恢復預設狀態 / 重啟

另外一個跟第一種場景類似,系統經過長時間的執行,工作狀態不正常了,一般怎麼解決呢?重啟一下。在我之前的前東家有一條不成文的規則,重要的系統在節假日前做排查,如果超過多少天沒有重啟,就會安排一次計劃中的重啟,來避免系統長時間的執行導致的異常的狀態。

所以可以用一些重啟的方案來把故障恢復到系統初始的狀態,把這個故障解決掉,這是一個非常強有力的一個故障解決方法。當然,重啟前需要考慮預期外的後果,比如可能啟動失敗會導致更差的後果。除了重啟,還可以重灌 / 重建系統,從預設或正常工作的系統複製一個副本出來。

 一次更換且只更換其中一個元件

當我們通過一些分析定位發現,故障可能發生在某個子系統或者某幾個模組之內,有什麼辦法能夠很快的定位問題呢?可以嘗試去更換其中一個部件,然後測試下。使用這個方法,可以通過排查一步一步精確定位到故障點,然後去解決。這為我們以後遇到類似的問題提供了寶貴的經驗。在使用這個方法的過程中,需要注意,每次只更換一個元件,測試完成後如果需要更換其他部件,首先要講之前更改的恢復原狀。否則可能會因為變更導致出現多個問題,影響和干擾問題的解決。

寫在最後

troubleshooting 既是一門科學,也是藝術。除此之外,還可以嘗試復現問題、更改啟動和配置順序等等方法,在實踐中根據時間、資源、場景情況和限制,選擇最適合的策略,完成 troubleshooting。Happy troubleshooting!

作者介紹

滕傳永,美團雲架構師。先後在百度和 eBay 從事系統和服務運維工作,工作涉及基礎服務運維,大規模系統部署和優化,虛擬化等。12 年加入美團,負責運維工作,主要集中在基礎服務運維,資料中心和網路建設,雲端計算環境建設和運維等方面。

文章來自微信公眾號:高效開發運維