一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php+redis在實際項目中HTTP 500: Internal Server Error故障排除

php+redis在實際項目中HTTP 500: Internal Server Error故障排除

2021-04-19 16:24PHP教程網(wǎng) PHP教程

用戶量快速增長,訪問量在短時間內(nèi)翻倍,由于前期容量規(guī)劃做得比較好,硬件資源可以支撐,可是軟件系統(tǒng)方面出現(xiàn)了大問題:40% 的請求都會返回 HTTP 500: Internal Server Error

問題描述
用戶量快速增長,訪問量在短時間內(nèi)翻倍,由于前期容量規(guī)劃做得比較好,硬件資源可以支撐,可是軟件系統(tǒng)方面出現(xiàn)了大問題:
40% 的請求都會返回 HTTP 500: Internal Server Error
通過查看日志,發(fā)現(xiàn)錯誤是在 PHP <-> Redis 的連接處理上
調(diào)試處理

第1次
剛開始時并沒有找到根本原因,只能嘗試各種與錯誤相關(guān)的辦法,例如:
增加 PHP 連接數(shù),并把超時時間從 500ms 增加到 2.5s
禁止掉 PHP 設(shè)置中的 default_socket_timeout
在主機系統(tǒng)中禁止掉 SYN cookies
檢查 Redis 和 Webservers 的文件描述符數(shù)量
增加主機系統(tǒng)的 mbuffer
調(diào)整 TCP backlog 數(shù)量
……

嘗試了很多方法,但全部無效

第2次
想在預(yù)發(fā)布環(huán)境中重現(xiàn)這個問題,可惜,還是沒成功,應(yīng)為流量不夠大,無法復(fù)現(xiàn)

第3次
會不會是代碼中沒有關(guān)閉 Redis 連接呢?
正常來講,PHP在執(zhí)行結(jié)束時會自動關(guān)閉資源連接,但老版本中會有內(nèi)存泄漏的問題,保險起見,把代碼都修改一遍,手動關(guān)閉連接
結(jié)果還是無效

第4次
懷疑目標:phpredis 這個客戶端庫
做 A/B 測試,替換回 predis 這個庫,部署到數(shù)據(jù)中心中 20% 的用戶量上
得益于良好的代碼結(jié)構(gòu),替換工作很快完成
可結(jié)果依舊是無效,但也有好的一面,可以證明 phpredis 沒問題嘛

第5次
查看了一下 Redis 的版本,是 v2.6,當時最新版本是 v2.8.9
升級 Redis 試一下吧,升完后還是不行
沒事兒,要保持樂觀,這不順便把 Redis 版本升為最新的了

第6次
通過查找大量文檔,在官方文檔中發(fā)現(xiàn)了一個調(diào)試好方法 Redis Software Watchdog,打開后執(zhí)行:

?
1
2
$ redis-cli --latency -p 6380 -h 1.2.3.4
min: 0, max: 463, avg: 2.03 (19443 samples)

查看 Redis 日志:

?
1
2
3
4
5
6
7
8
...
[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
...

發(fā)現(xiàn)了問題:
每隔幾分鐘就向硬盤保存一次數(shù)據(jù),fork 一個后臺存儲進行為什么需要大概 400ms(通過上面日志的第1條和第2條的時間可以看出來)

到這兒,終于找到問題的根源了,因為 Redis 實例中有大量的數(shù)據(jù),導(dǎo)致每次持久化操作 fork 后臺進程時非常耗時,并且在他們的業(yè)務(wù)中經(jīng)常修改key,又導(dǎo)致了頻繁觸發(fā)持久化,也就經(jīng)常產(chǎn)生對 Redis 的阻塞

處理辦法:使用單獨的 slave 來做持久化

這個 slave 不處理真實的流量請求,唯一的作用就是處理持久化,把之前 Redis 實例上的持久化操作轉(zhuǎn)移到這個 slave 上

效果非常明顯,問題基本解決,但有的時候還是會報錯

第7次
排查可能阻塞 Redis 的慢查詢,發(fā)現(xiàn)有地方使用了 keys *

因為 Redis 中的數(shù)據(jù)越來越多,這個命令自然會產(chǎn)生嚴重阻塞

可以使用 scan 進行替換

第8次
經(jīng)過前面的調(diào)整,問題已經(jīng)解決,隨后的幾個月,即使流量在不斷增長,也都抗住了

但他們意識到了新的問題:

現(xiàn)在的方式是,來一個請求就創(chuàng)建一個 Redis 連接,執(zhí)行幾個命令,然后再斷開連接,在請求量很大時,這個方式產(chǎn)生了嚴重的性能浪費,一半以上的命令是用來處理連接操作的,這都超過了業(yè)務(wù)邏輯上的處理,也使 Redis 變慢

解決方法:引入 proxy,他們選擇了 twitter 的 twemproxy,只需要在每個 webserver 上安裝代理,twemproxy負責與 Redis 實例進行持久連接,這樣就大大減少了連接方面的操作

twemproxy還有兩個方便的地方:

支持 memcached
可以阻止非常耗時或者危險的命令,例如 keys、flushall
效果自然很完美,再也不用擔心之前的連接錯誤

第9次
通過數(shù)據(jù)分片來繼續(xù)優(yōu)化:

對不同上下文的數(shù)據(jù)拆分隔離
對相同上下文的數(shù)據(jù)進行一致性哈希分片
效果:

減少了每臺機器上的請求、負載
提升了緩存的可靠性,不擔心節(jié)點故障

小結(jié)
原文作者寫的非常好,詳細的描述了他們在 Redis 應(yīng)用上的成長歷程,是很值得參考的實踐經(jīng)驗
原文地址http://tech.trivago.com/2017/01/25/learn-redis-the-hard-way-in-production

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉草莓视频 | 成年人在线免费观看视频网站 | 男人天堂网av | 成人免费在线视频 | 欧美大屁屁 | 欧美怡红院视频一区二区三区 | 16男男gaygays | 好大好湿好硬好爽好深免费视频 | 私人影院免费观看 | 精品国产一区二区在线观看 | 欧美精品色精品一区二区三区 | 操b图片| 女人被爽到呻吟娇喘的视频动态图 | 深夜a| 色多多视频在线 | 日韩欧美一区二区三区中文精品 | 日产精品一卡2卡三卡4乱码久久 | 亚洲瑟瑟网 | 成人欧美一区在线视频在线观看 | 麻豆网站在线看 | 日本三级做a全过程在线观看 | 欧美福利在线播放 | 国产精品亚洲专区在线播放 | 亚洲精品国产自在现线最新 | 精品图区| 亚洲欧美日韩久久一区 | 免费大秀视频在线播放 | 欧美一级特黄特色大片 | 青青网在线视频 | 色亚州| 国产精品亚洲午夜不卡 | 91大神在线精品播放 | 精品国产品香蕉在线观看75 | 闺蜜的样子小说安沁在线阅读 | 亚洲色欲色欲综合网站 | 95视频在线观看在线分类h片 | 好吊妞视频998www | 天使萌痴汉在线中文字幕 | 欧美伊人影院 | 成人天堂入口网站 | 91进入蜜桃臀在线播放 |