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上繼續分析了,要轉換思路。