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

2021-08-11 08:31:53 字數 2957 閱讀 6101

前言常見問題

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

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

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

處理思路

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

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

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

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

重啟:當你的服務執行一段時間,突然出現了異常。如程序占用了cpu 100%。你可以通過重啟的方式來解決。重啟的過程就是乙個資源釋放和重新分配的過程。

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

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

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

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

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

保留執行狀態:這個就是案發現場的保留。比如,你發現乙個程序占用cpu 100%。你為了解決問題,貿然的重啟程序,就是破壞了現場。

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

對於php開發的系統,為了實現更健壯的日誌系統,我這裡有個小tip。可以使用register_shutdown_function 和 error_get_last。具體的可以檢視。博文位址

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

排查問題

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

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

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

網路:咱們畢竟是搞網路通訊程式設計的。對網路通訊方面的知識有所了解,是必須的。尤其是對一些協議要有大概的了解。通訊協議的重要性,並不僅僅侷限於面試時撐撐場面,更重要的是用來解決問題。檢視博文 《tcpdump 和 wireshark組合拳,揪出有問題的機器》

軟體:對搭建系統所使用軟體要有所了解。如對memcached的記憶體管理策略有所了解的話,可以讓你更好的對其調優,充分的利用記憶體,減少記憶體浪費。

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

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

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

案例分析

案例分析中給出了三個案例。涉及網路,語言和系統三個方面。

網路:使用tcpdump排查mysql資料庫tps飆公升的問題

語言:php程序導致伺服器cpu 100問題追查過程

系統:乙個echo引起的程序崩潰

更多案例請檢視 

線上服務宕機問題排查思路

出現線上問題的時候,緊張在所難免,有一篇文章講解新手與老手處理線上問題的差別 新手遇到問題後,都是忙於排查問題,這個是怎麼回事 怎麼突然宕機了 老手會首先想 是否有服務降級策略 怎麼快速恢復服務 重啟吧,90 的問題能夠靠重啟解決 是不是上游或者下游有異常 在分布式系統橫行的今天,大部分故障可分為一...

線上問題排查

問題排查方 長期改進建議 由於業務應用 bug 本身或引入第三方庫 環境原因 硬體問題等原因,線上服務出現故障 問題幾乎不可避免。例如,常見的現象包括請求超時 使用者明顯感受到系統發生卡頓等等。作為乙個合格的研發人員 技術人員 不僅要能寫得一手好 掌握如何排查問題技巧也是研發人高階必須掌握的實戰技能...

線上操作與線上問題排查實戰

一 了解機器連線數情況 問題 192.168.88.136的sshd的監聽埠是22,如何統計192.168.88.136的sshd服務各種連線狀態 time wait close wait established 的連線數。netstat an grep 192.168.88.136 22 awk ...