php+redis在實際專案中HTTP 500: Internal Server Error故障排除的方法
用戶量快速增長,訪問量在短時間內翻倍,由於前期容量規劃做得比較好,硬體資源可以支撐,可是軟體系統方面出現了大問題:40% 的請求都會返回HTTP 500: Internal Server Error
問題描述
用戶量快速成長,訪問量在短時間內翻倍,由於前期容量規劃做得比較好,硬體資源可以支撐,可是軟體系統方面出現了大問題:
40% 的請求都會回傳HTTP 500: Internal Server Error
透過檢視日誌,發現錯誤是在PHP <-> Redis 的連線處理上
偵錯處理
第1次
剛開始時並沒有找到根本原因,只能嘗試各種與錯誤相關的辦法,例如:
增加PHP 連接數,並把逾時時間從500ms 增加到2.5s
禁止掉PHP 設定中的default_socket_timeout
在主機系統中禁止掉SYN cookies
檢查Redis 和Webservers 的檔案描述符數量
增加主機系統的mbuffer
調整TCP backlog 數量
…
嘗試了很多方法,但全部無效
第2次
想在預發布環境中重現這個問題,可惜,還是沒成功,應為流量不夠大,無法復現
第3次
會不會是程式碼中沒有關閉Redis連接呢?
正常來講,PHP在執行結束時會自動關閉資源連接,但舊版中會有記憶體洩漏的問題,保險起見,把程式碼都修改一遍,手動關閉連接
結果還是無效
第4次
懷疑目標:phpredis 這個客戶端函式庫
做A/B 測試,替換回predis 這個函式庫,部署到資料中心中20% 的使用者量上
得益於好的程式碼結構,替換工作很快完成
可結果依舊是無效,但也有好的一面,可以證明phpredis 沒問題嘛
##第5次查看了一下Redis 的版本,是v2.6,當時最新版本是v2.8.9
升級Redis 試一下吧,升完後還是不行
沒事,要保持樂觀,這不順便把Redis 版本升到最新的了
第6次透過查找大量文檔,在官方文檔中發現了一個調試好方法Redis Software Watchdog,打開後執行:
$ redis-cli --latency -p 6380 -h 1.2.3.4 min: 0, max: 463, avg: 2.03 (19443 samples)
#
... [20398] 22 May 09:20:55.351 * 10000 changes in 60 seconds. Saving... [20398] 22 May 09:20:55.759 * Background saving started by pid 41941 [41941] 22 May 09:22:48.197 * DB saved on disk [20398] 22 May 09:22:49.321 * Background saving terminated with success [20398] 22 May 09:25:23.299 * 10000 changes in 60 seconds. Saving... [20398] 22 May 09:25:23.644 * Background saving started by pid 42027 ...
##發現了問題:
每隔幾分鐘就向硬碟保存一次數據,fork 一個後台存儲進行為什麼需要大概400ms(透過上面日誌的第1條和第2條的時間可以看出來)
到這兒,終於找到問題的根源了,因為Redis 實例中有大量的數據,導致每次持久化操作fork 後台進程時非常耗時,並且在他們的業務中經常修改key,又導致了頻繁觸發持久化,也就經常產生對Redis 的阻塞
處理辦法:使用單獨的slave 來做持久化
這個slave 不處理真實的流量請求,唯一的作用就是處理持久化,把之前Redis 實例上的持久化操作轉移到這個slave 上
效果非常明顯,問題基本上解決,但有的時候還是會報錯
##第7次
排查可能阻塞Redis 的慢查詢,發現有地方使用了keys *因為Redis 中的資料越來越多,這個指令自然會產生嚴重阻塞
第8次
經過前面的調整,問題已經解決,隨後的幾個月,即使流量在不斷增長,也都抗住了
#但他們意識到了新的問題:
#可以阻止非常耗時或危險的指令,例如keys、flushall
效果自然很完美,再也不用擔心先前的連線錯誤
第9次
#透過資料分片來繼續優化:
對不同上下文的資料拆分隔離對相同上下文的資料進行一致性雜湊分片
減少了每台機器上的請求、負載
提升了快取的可靠性,不擔心節點故障
以上就是本文的全部內容,希望對大家的學習有幫助。
相關推薦:
PHP取得
redis裡不存在的6位元隨機數的方法#
以上是php+redis在實際專案中HTTP 500: Internal Server Error故障排除的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

http狀態碼520是指伺服器在處理請求時遇到了一個未知的錯誤,無法提供更具體的資訊。用於表示伺服器在處理請求時發生了一個未知的錯誤,可能是由於伺服器配置問題、網路問題或其他未知原因導致的。通常是由伺服器配置問題、網路問題、伺服器過載或程式碼錯誤等原因導致的。如果遇到狀態碼520錯誤,最好聯絡網站管理員或技術支援團隊以取得更多的資訊和協助。

http狀態碼403是伺服器拒絕了客戶端的請求的意思。解決http狀態碼403的方法是:1、檢查身份驗證憑證,如果伺服器要求身份驗證,確保提供正確的憑證;2、檢查IP位址限制,如果伺服器對IP位址進行了限制,確保客戶端的IP位址被列入白名單或未列入黑名單;3、檢查文件權限設置,如果403狀態碼與文件或目錄的權限設置有關,確保客戶端具有足夠的權限訪問這些文件或目錄等等。

掌握HTTP301狀態碼的意思:網頁重定向的常見應用場景隨著網路的快速發展,人們對網頁互動的要求也越來越高。在網頁設計領域,網頁重定向是一種常見且重要的技術,透過HTTP301狀態碼來實現。本文將探討HTTP301狀態碼的意義以及在網頁重新導向中的常見應用場景。 HTTP301狀態碼是指永久重新導向(PermanentRedirect)。當伺服器接收到客戶端發

如何使用NginxProxyManager實現HTTP到HTTPS的自動跳轉隨著互聯網的發展,越來越多的網站開始採用HTTPS協議來加密傳輸數據,以提高數據的安全性和用戶的隱私保護。由於HTTPS協定需要SSL憑證的支持,因此在部署HTTPS協定時需要有一定的技術支援。 Nginx是一款強大且常用的HTTP伺服器和反向代理伺服器,而NginxProxy

HTTP狀態碼200:探索成功回應的意義與用途HTTP狀態碼是用來表示伺服器回應狀態的數字代碼。其中,狀態碼200表示請求已成功被伺服器處理。本文將探討HTTP狀態碼200的具體意義與用途。首先,讓我們來了解HTTP狀態碼的分類。狀態碼分為五個類別,分別是1xx、2xx、3xx、4xx和5xx。其中,2xx表示成功的回應。而200是2xx中最常見的狀態碼

使用http.PostForm函數發送帶有表單資料的POST請求在Go語言的http包中,可以使用http.PostForm函數發送帶有表單資料的POST請求。 http.PostForm函數的原型如下:funcPostForm(urlstring,dataurl.Values)(resp*http.Response,errerror)其中,u

快速應用:PHP非同步HTTP下載多個檔案的實用開發案例分析隨著互聯網的發展,檔案下載功能已成為許多網站和應用程式的基本需求之一。而對於需要同時下載多個檔案的場景,傳統的同步下載方式往往效率低且耗費時間。為此,使用PHP非同步HTTP下載多個檔案成為了越來越常見的解決方案。本文將透過一個實際的開發案例,詳細分析如何使用PHP非同步HTTP

C#中常見的網路通訊和安全性問題及解決方法在當今互聯網時代,網路通訊已成為了軟體開發中必不可少的一部分。在C#中,我們通常會遇到一些網路通訊的問題,例如資料傳輸的安全性、網路連線的穩定性等。本文將針對C#中常見的網路通訊和安全性問題進行詳細討論,並提供相應的解決方法和程式碼範例。一、網路通訊問題網路連線中斷:網路通訊過程中,可能會出現網路連線的中斷,這會導致
