記錄一次生產(chǎn)環(huán)境問題排查過程:
生產(chǎn)環(huán)境部署方式:nginx + uwsgi + flask
問題描述:
發(fā)現(xiàn)生產(chǎn)環(huán)境中之前正常運行的服務(wù)突然不可用了,查看程序日志發(fā)現(xiàn)部分接口訪問時報I/O寫錯誤,nginx acess.log顯示504,error.log顯示 upstream time out.
同時 netstat -apn | grep 6379 | wc -l
檢查發(fā)現(xiàn)redis存在大量連接,進(jìn)一步檢查發(fā)現(xiàn)其中大多為 SYN_SENT
包,連接大多歸屬于uwsgi
進(jìn)程。
因為程序中有很多接口被調(diào)用是會訪問redis, 以為是redis連接池導(dǎo)致,對程序中的redis連接池進(jìn)行優(yōu)化后重啟服務(wù),剛啟動時一切正常,http 200, 但幾分鐘后服務(wù)再次掛掉,http 504.
檢查系統(tǒng)資源使用情況,發(fā)現(xiàn) kswapd0
進(jìn)程CPU占用很高,這個進(jìn)程是當(dāng)物理內(nèi)存不足時,會將一部分硬盤當(dāng)做虛擬內(nèi)存來使用, 使用swap分區(qū)與內(nèi)存換頁操作交換數(shù)據(jù),導(dǎo)致CPU占用過高, 再細(xì)看發(fā)現(xiàn)redis-server
內(nèi)存占用已超過100%:

進(jìn)入redis中查看info memory
和各存儲數(shù)據(jù)的key下數(shù)據(jù)量,果然存在大量未處理完畢的數(shù)據(jù)。
到此問題終于是找到了。
設(shè)置redis最大占用內(nèi)存
# 編輯redis配置文件,加入最大內(nèi)存使用限制,我根據(jù)服務(wù)器的情況設(shè)置為3G
maxmemory 3221225472
設(shè)置redis數(shù)據(jù)過期策略:
redis中有6種過期策略:
# 根據(jù)LRU算法生成的過期時間來刪除
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# 根據(jù)LRU算法刪除任何key。
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# 根據(jù)過期設(shè)置來隨機(jī)刪除key。
# volatile-random -> remove a random key with an expire set
# 無差別隨機(jī)刪。
# allkeys-random -> remove a random key, any key
# 根據(jù)最近過期時間來刪除(輔以TTL)
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# 誰也不刪,直接在寫操作時返回錯誤。
# noeviction -> don't expire at all, just return an error on write operations
在redis配置文件中設(shè)置過期策略為:maxmemory-policy allkeys-lru
一開始是設(shè)置為volatile-lru
的,但是該策略只是清除設(shè)置過期時間的key值,因為很多key并沒有設(shè)置過期時間。因此修改為maxmemory-policy allkeys-lru
,指明非活躍近期很少用的key值清除.
在使用maxmemory-policy allkeys-lru
策略時,內(nèi)存超限后將不再存儲數(shù)據(jù),但數(shù)據(jù)的讀取刪除操作不會受影響,超限時顯示錯誤
OOM command not allowed when used memory > 'maxmemory'

重啟程序,至此服務(wù)終于正常運行。
總結(jié):本次的問題歸根結(jié)底是redis中存儲入了大量臟數(shù)據(jù),但數(shù)據(jù)處理并沒有及時的清理掉這部分?jǐn)?shù)據(jù),最終導(dǎo)致服務(wù)停滯,allkeys-lru
策略有可能會將長期未用但實際有用的數(shù)據(jù)清理掉,所以還是應(yīng)優(yōu)化數(shù)據(jù)處理為主。
到此這篇關(guān)于redis 限制內(nèi)存使用大小的實現(xiàn)的文章就介紹到這了,更多相關(guān)redis 限制內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- redis內(nèi)存空間效率問題的深入探究
- redis 使用lettuce 啟動內(nèi)存泄漏錯誤的解決方案
- 淺談內(nèi)存耗盡后Redis會發(fā)生什么
- 一次關(guān)于Redis內(nèi)存詭異增長的排查過程實戰(zhàn)記錄
- 淺談redis內(nèi)存數(shù)據(jù)的持久化方式
- 內(nèi)存型數(shù)據(jù)庫Redis持久化小結(jié)
- 降低PHP Redis內(nèi)存占用
- Redis教程(十四):內(nèi)存優(yōu)化介紹
- 詳解Redis瘦身指南