天天看點

線上PHP問題排查思路與實踐

不同使用者看到的錯誤可能不一樣。一般使用者看到的錯誤都是表層的現象。如,裸奔的錯誤頁面:

線上PHP問題排查思路與實踐

<img src="http://www.bo56.com/wp-content/uploads/2015/09/luoben.png" alt="luoben" width="693" height="522" class="alignnone size-full wp-image-829" /></a></p>

這種裸奔的錯誤頁面,經常被使用者成為亂碼,太醜太暴漏。甚至把一些不應該暴漏的敏感資訊都暴漏了。如,nginx版本号,檔案路徑等。為了解決這些問題,設計師們又做了有情調的錯誤頁。但是,錯誤五花八門,并不是一個錯誤頁能掩蓋的。

對于工程師,咱們看問題可能會更深入些。能看到問題背後的問題。如,看到502錯誤,他們會想到可能是後端php-fpm程序出現問題。如後端的php-fpm程序已經死掉,nginx無法連接配接到php-fpm程序。

線上PHP問題排查思路與實踐

<img src="http://www.bo56.com/wp-content/uploads/2015/09/jiejuesilu.png" alt="jiejuesilu" width="702" height="525" class="alignnone size-full wp-image-831" /></a></p>

雖然問題五發八門,但是有一套解決思路可以整體處理這些問題。解決思路大概分為如下幾個部分:恢複服務,保留現場,排查問題和驗證。下面對這幾部分分别加以說明。

線上PHP問題排查思路與實踐

<img src="http://www.bo56.com/wp-content/uploads/2015/09/huifufuwu.png" alt="huifufuwu" width="701" height="525" class="alignnone size-full wp-image-834" /></a></p>

恢複服務,顧名思義。就是趕緊讓使用者感受不到錯誤的存在。為什麼這樣做呢?原因有如下兩個。第一,如果不這樣做,使用者看到的是錯誤頁面,使用者體驗不好。可能還會對公司帶來直接的經濟損失。 第二,如果不這樣做,年底你的獎金就飛了。那如何恢複服務呢?下面說下不同場景下的幾種操作方式。

摘機:所謂摘機就是摘除有問題的機器。這種操作的應用場景是,當提供服務的多台機器中,有部分機器出現問題時,可以這樣操作。這就要求我們,對于線上運作的服務,必須保障有多台機器運作相同的服務,多台機器間沒有依賴關系。其中一台或者幾台被摘除不會影響到其他機器。

復原:所謂復原就是恢複到操作之前的狀态。這種操作的應用場景是,當進行了上線或者軟體配置修改後,出現了問題。

重新開機:當你的服務運作一段時間,突然出現了異常。如程序占用了cpu 100%。你可以通過重新開機的方式來解決。重新開機的過程就是一個資源釋放和重新配置設定的過程。

降級:當你的網站的通路量超出了你伺服器的負載時,網站就會出現問題。這個時候,就需要保證主要功能可用。把損失降到最低。

當然,網站出現問題時,并不是教條的套用,做單一的操作來恢複服務。而是根據情況進行相應的操作。遇到問題時,可能需要進行多個恢複服務的操作。但是,所有的這些操作的原則就是,把損失降到最低。

線上PHP問題排查思路與實踐

<img src="http://www.bo56.com/wp-content/uploads/2015/09/baoliuxianchang.png" alt="baoliuxianchang" width="701" height="525" class="alignnone size-full wp-image-836" /></a></p>

其實問題排查和警察破案過程是一樣的。想想警察是如何保留現場的?商場内安裝攝像頭。不友善安裝攝像頭的場所(洗頭房),就在場所外的大街上安裝攝像頭。雖然有監控,但是還有會有案件發生。案件出現後,他們會保護案發現場。其實我們對現場的保留,也是從這幾方面入手。

系統内部日志:這就好比在商場内安裝攝像頭。如果有良好的日志記錄,那就可以記錄系統運作過程中出現的一些異常。良好的日志系統,也是我們在選擇開源軟體時的重要标準。

系統外部監控:這個就好比洗頭房外大街上的監控。在系統中,總有一些地方是你不友善或者沒權增加日志記錄的。如,咱們在調用第三方服務的時候,肯定你也不友善在第三方服務中添加日志。這個時候,我們就需要增加對第三方服務的監控和日志記錄。能時刻知道第三方服務是否可用。

保留運作狀态:這個就是案發現場的保留。比如,你發現一個程序占用cpu 100%。你為了解決問題,貿然的重新開機程序,就是破壞了現場。

保留現場和恢複服務并沒有一個明确的先後關系。他們共同是問題排查的基礎。恢複了服務,你才可用安心的進行問題排查。保留了現場,你才有問題排查的資料來源。有時候,保留現場和恢複服務會有沖突。如,你就一台機器提供服務,這台機器上出現了問題,這個時候要如何處理呢?這個時候建議最短的時間備份現場,然後盡快的恢複服務。如,一個程序占用cpu 100%,那你就可以用 gcore 把程序生成core檔案,然後重新開機程序。

所有的這些保留現場的操作,就是為之後的問題排查提供資料。

排查問題的過程才是展現你福爾摩斯風采的時候。問題排查的過程就是用你掌握的知識和工具去分析資料的過程。現在,資料已經有了。知識和工具都需要掌握哪些呢?

知識的海洋是浩瀚的。這裡我隻能做個大概的分類。

語言:php語言方面,除了了解基本文法以外,還要對php的核心有所了解。對php核心有所了解後,你就大概了解了php的執行流程。出現問題,你就可以大概推測是那個環節出現了問題。發現問題後,你可以根據掌握的知識分析出大概那裡出現了問題。比如,當一個php程序占用cpu 100%。你就可以通過掌握的php核心的資料結構找出是大概那裡的代碼出現了問題。

網絡:咱們畢竟是搞網絡通信程式設計的。對網絡通信方面的知識有所了解,是必須的。尤其是對一些協定要有大概的了解。通信協定的重要性,并不僅僅局限于面試時撐撐場面,更重要的是用來解決問題。軟體:對搭建系統所使用軟體要有所了解。如對memcached的記憶體管理政策有所了解的話,可以讓你更好的對其調優,充分的利用記憶體,減少記憶體浪費。

系統:避免咱們搭建的系統運作在作業系統上。那就需要對作業系統所有了解。如,權限,系統日志位置,oom等。

工欲善其事必先利其器。網絡上有一張圖總結的很好,把常用的工具總結的很全。

線上PHP問題排查思路與實踐

<img src="http://www.bo56.com/wp-content/uploads/2015/09/螢幕快照-2015-09-02-上午9.09.27.png" alt="螢幕快照 2015-09-02 上午9.09.27" width="694" height="517" class="alignnone size-full wp-image-845" /></a></p>

如果你把所有的工具都能很好的掌握,你就是神啦。