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

Springboot内置tomcat禁止不安全HTTP方法1、在tomcat的web.xml中可以配置如下内容让tomcat禁止不安全的HTTP方法/*PUTDELETEHEADOPTIONSTRACEBASIC2、Springboot使用内置tomcat没有web.xml配置文件,可以通过以下配置进行,简单来说就是要注入到Spring容器中@ConfigurationpublicclassTomcatConfig{@BeanpublicEmbeddedServletContainerFacto

1.HttpURLConnection使用JDK原生提供的net,无需其他jar包,代码如下:importcom.alibaba.fastjson.JSON;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.HttpURLConnection;

一、前言#ssl写在443端口后面。这样http和https的链接都可以用listen443sslhttp2default_server;server_namechat.chengxinsong.cn;#hsts的合理使用,max-age表明hsts在浏览器中的缓存时间,includesubdomainscam参数指定应该在所有子域上启用hsts,preload参数表示预加载,通过strict-transport-security:max-age=0将缓存设置为0可以撤销hstsadd_head

随着互联网的不断发展和改善,Web服务器在速度和性能上的需求也越来越高。为了满足这样的需求,Nginx已经成功地掌握了HTTP2协议并将其融入其服务器的性能中。HTTP2协议要比早期的HTTP协议更加高效,但同时也存在着特定的安全问题。本文将为您详细介绍如何进行Nginx的HTTP2协议优化和安全设置。一、Nginx的HTTP2协议优化1.启用HTTP2在N

一、urllib概述:urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块:urllib.request:它是最基本的http请求模块,用来模拟发送请求urllib.error:异常处理模块,如果出现错误可以捕获这些异常urllib

httpkeepalive在http早期,每个http请求都要求打开一个tpcsocket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次tcp连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少time_wait状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-ali

一、概述在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。在Java项目中调用第三方接口的方式有:1、通过JDK网络类Java.net.HttpURLConnection;2、通过common封装好的HttpClient;3、通过Apache封装好的CloseableHttpClient;4、通过SpringBoot-RestTemplate;二、Java调用第三方

被动检查对于被动健康检查,nginx和nginxplus会在事件发生时对其进行监控,并尝试恢复失败的连接。如果仍然无法恢复正常,nginx开源版和nginxplus会将服务器标记为不可用,并暂时停止向其发送请求,直到它再次标记为活动状态。上游服务器标记为不可用的条件是为每个上游服务器定义的,其中包含块中server指令的参数upstream:fail_timeout-设置服务器标记为不可用时必须进行多次失败尝试的时间,以及服务器标记为不可用的时间(默认为10秒)。max_fails-设置在fai


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

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