1. 程式人生 > >Redis Cluster機器內存充爆處理

Redis Cluster機器內存充爆處理

mes bug com 情況下 bubuko info nta 產生 大小

機器配置

系統:CentOS6.7
配置:4C8G
應用:Redis Cluster,實例化

現象

1、無法啟動redis,啟動後系統OOM,直接殺死
2、Redis: OOM command not allowed when used memory > ‘maxmemory’

原因

內存已滿,不允許數據在寫入
技術分享圖片
註:
used_memory_human表示已用內存
used_memory_rss表示系統給redis分配的內存(即常駐內存)
mem_fragmentation_ratio=used_memory_rss/used_memory比例,一般情況下,used_memory_rss略高於used_memory,當內存碎片較多時,則mem_fragmentation_ratio會較大,可以反映內存碎片是否很多

解決過程

1、首先查看redis的內存使用,如上圖。可以看到已用內存5G多,常駐內存3.8G多。而我們的機器內存只有8G可用。明顯內存已經充爆。接下來想到的就應該是key的量太大了還是value的量太大了。
2、找出redis中的key。

  1. ###查看key的個數(最好是把key拿出來分析)
  2. keys *
  3. echo "keys *" |/usr/local/redis/bin/redis-cli -p 6381 > /tmp/6381.log

3、分析發現key中有650000的common:order:LogCacheKey這樣的key,接下來我們需要確認下這些key的大小

  1. ###查看key大小的命令
  2. debug object
  3. echo ‘debug object "common:order:LogCacheKey90bef863-dfc7-4739-8404-9b6624a70196"‘ |/usr/local/redis/bin/redis-cli -p 6381

4、分析發現common:order:LogCacheKey所占用的內存為3G左右。因此找到元兇為這個key所導致的。
5、清理key

  1. for i in `grep common:order:Log 6381.log`;do echo "del $i" |/usr/local/redis/bin/redis-cli -p 6381; done

6、key已經找到刪除,現在要查找是哪個應用產生的。
因為開發人員沒在,那從運維角度,我是從網絡流量來分析的,使用iftop
技術分享圖片


根據流量大小,找到對應的主機,聯系到開發人員確認。

小技巧

如果key少的話,可以直接取出每個key對應的value的大小,按照從大到小的順序排序

  1. for i in `cat /tmp/6379.log`;do echo -n "$i "; echo "debug object $i"|/usr/local/redis/bin/redis-cli -p 6379|awk -F ‘[ |:]+‘ ‘{print $9}‘;done|sort -r -n -k2

總結

1、問題發生後,用最快最簡單的方式先把問題解決。減少影響的時間。比如升級擴大內存。
2、此次遇到的問題是在測試環境,如果確認redis中數據可以清除,可以使用暴力的方式直接清空本地的實例化文件,將內存釋放出來。但是生產環境切不可進行此操作。

Redis Cluster機器內存充爆處理