用戶量快速增長,訪問量在短時間內翻倍,由於前期容量規劃做得比較好,硬體資源可以支撐,可是軟體系統方面出現了大問題: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)查看Redis 日誌:
#
... [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中文網其他相關文章!

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

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