一次redis OOM問題分析解決,rdbtools安裝分析redis內存

 

遇到比較尷尬的項目是難免的,質量真是亂的一批,對於redis的使用也是亂用,那麼就會有一個問題,內存撐不住怎麼辦?

不是高可用,只有一個裸redis(高可用方案下次再說)

目錄

分析步驟

OOM緊急解決方案:

如何找大key

安裝rdbtools

使用 redis-rdb-tools 生成內存快照:


分析步驟

進入redis,查看內存使用情況

redis -a 密碼
info memory

服務器分配了5G內存,maxmemory爲5G,可用4.66G,發生OOM的時候已經全部用完;詳細分析可以專門問下度娘

 

OOM緊急解決方案

提高最大內存,config set maxmemory xxx

設置內存淘汰策略:我設置爲allkeys-lru

Redis5.0定義了幾種策略用來處理這種情況:

(1)volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰。

(2)volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰。

(3)volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰。

(4)volatile-lfu:從已設置過期時間的數據集挑選使用頻率最低的數據淘汰。

(5)allkeys-lru:從數據集中挑選最近最少使用的數據淘汰

(6)allkeys-lfu:從數據集中挑選使用頻率最低的數據淘汰。

(7)allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

(8) no-enviction(驅逐):禁止驅逐數據,這也是默認策略。意思是當內存不足以容納新入數據時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,採用no-enviction策略可以保證數據不被丟失。

這八種大體上可以分爲4中,lru、lfu、random、ttl。

 

當使用volatile-lru、volatile-random、volatile-ttl這三種策略時,如果沒有key可以被淘汰,則和noeviction一樣返回錯誤


但是這只是臨時方案,需要知道根本原因是什麼

問題:爲什麼5G還不夠用?肯定是有大key,或者使用過多,沒有設置過期時間

好了,1. 找出大key,2. 減少沒有必要的緩存,3. 必須設置過期時間

 

如何找大key

網上搜了半天有用工具,有用python,有用命令的;感興趣大家可以看下這篇文章還可以:https://www.cnblogs.com/yqzc/p/12425533.html

這裏我介紹一下用rdbtools分析感覺還蠻方便的

安裝rdbtools

pip install rdbtools      安裝

如果沒有安裝pip則安裝pip,教程請看:https://blog.csdn.net/Goligory/article/details/106033972

 

git clone https://github.com/sripathikrishnan/redis-rdb-tools

cd redis-rdb-tools

python setup.py install

安裝如下 

使用 redis-rdb-tools 生成內存快照:

rdb -c memory dump.rdb > memory.csv

這時候可能找不到dump.rdb

解決辦法:

登錄redis

命令:save

命令(找到安裝目錄):config get dir

退出,cd到安裝目錄就看到dump.rdb了

在有dump.rdb目錄下執行:rdb -c memory dump.rdb > memory.csv 即可,csv文件就在當前文件夾,可以導出來直接查看,效果如下

 

也可以用SQLite分析csv文件,這裏在這裏不說了,感興趣可以問度娘

 

 

 

參考:https://www.cnblogs.com/aresxin/p/9014617.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章