Redis: userd_memory使用超出maxmemory


Redis:userd_memory使用超出maxmemory

一、問題現象

2018.12.30 19:26分,收到Redis實例內存使用告警“內存使用率299%>=80%”,檢查實例info memory信息, 發現:userd memory=29.84G 而實例maxmemory=10G,集群中其它實例userd_memory均勻且保持在500M左右;

 

二、問題分析

1、檢查此實例中的key數量和大小,排查是否存在大key,執行dbsize,顯示當前實例有68個key,執行--bigkeys命令,顯示最大key是個hash類型的,size為500M;

2、持久化當前實例的數據,一般情況下,實例usermemory大小會介於rdb-aof文件大小之間,實際的userdmemory不超過850M,很顯然實例中沒有大key寫入,

     實例默認開啟aof,我們需要手動執行bgsave,生成dump文件;

    

3、集群中其它實例userd_memory均在500M左右,包括這個主實例對應的從實例;

4、上谷歌搜索后,改變分析思路,檢查實例輸入輸出緩沖區,執行client info 找出緩沖區最大的量,再執行client list 查看客戶端連接信息,發現輸出緩沖區有占用未釋放,

id=140220 addr=10.xx.xx.xx fd=100 name= age=1118 idle=197 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=206443 omem=4850384840 events=rw cmd=setex

其中qbuf表示輸入緩沖區的量,obl、oll、omem表示輸出緩沖區的量,obl表示固定緩沖區的量,oll表示動態緩沖區的量,omem表示輸出緩沖區共使用的字節數,換算后是4.6G

有多個客戶端連接輸出緩沖區很大。

 

三、問題處理

1、在當前實例對應的從實例上執行failover,倒換主從關系;

2、觀察之前的主實例(現在的從實例),發現userd_memory沒有下降,再執行重啟操作,讓主從之間進行一次全量同步;

 

四、總結

1、在問題處理操作階段,可以通過重啟主實例,Rediscluster會自動進行主從切換,省掉一步,但為了觀察過程,我選擇了先切換再重啟;

2、問題處理階段,實例的dump文件大小只有100多M,和其它實例的dump文件基本一致,所以當時已不用在實例中存在的key上繼續分析了,要轉換思路。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM