一、现象:
    redis-cluster某个分片内存飙升,明显比其他分片高很多,而且持续增长。并且主从的内存使用量并不一致。
 
二、分析可能原因:
 1.  redis-cluster的bug (这个应该不存在)
 2. 客户端的hash(key)有问题,造成分配不均。(redis使用的是crc16, 不会出现这么不均的情况)
 3. 存在个别大的key-value: 例如一个包含了几百万数据set数据结构(这个有可能)
 4. 主从复制出现了问题。
 5. 其他原因
 
三、调查原因:
 1. 经查询,上述1-4都不存在
 2. 观察info信息,有一点引起了怀疑: client_longes_output_list有些异常。
3. 于是理解想到服务端和客户端交互时,分别为每个客户端设置了输入缓冲区和输出缓冲区,这部分如果很大的话也会占用Redis服务器的内存。
 
从上面的client_longest_output_list看,应该是输出缓冲区占用内存较大,也就是有大量的数据从Redis服务器向某些客户端输出。
于是使用client list命令(类似于mysql processlist) redis-cli -h host -p port client list | grep -v "omem=0",来查询输出缓冲区不为0的客户端连接,于是查询到祸首monitor,于是豁然开朗.
 
monitor的模型是这样的,它会将所有在Redis服务器执行的命令进行输出,通常来讲Redis服务器的QPS是很高的,也就是如果执行了monitor命令,Redis服务器在Monitor这个客户端的输出缓冲区又会有大量“存货”,也就占用了大量Redis内存。
 
 
四、紧急处理和解决方法
进行主从切换(主从内存使用量不一致),也就是redis-cluster的fail-over操作,继续观察新的Master是否有异常,通过观察未出现异常。
查找到真正的原因后,也就是monitor,关闭掉monitor命令的进程后,内存很快就降下来了。
 
五、 预防办法:
1. 为什么会有monitor这个命令发生,我想原因有两个:
(1). 工程师想看看究竟有哪些命令在执行,就用了monitor
(2). 工程师对于redis学习的目的,因为进行了redis的托管,工程师只要会用redis就可以了,但是作为技术人员都有学习的好奇心和欲望。
2. 预防方法:
(1) 对工程师培训,讲一讲redis使用过程中的坑和禁忌
(2) 对redis云进行介绍,甚至可以让有兴趣的同学参与进来
(3) 针对client做限制,但是官方也不建议这么做,官方的默认配置中对于输出缓冲区没有限制。
  1. client-output-buffer-limit normal 0 0 0
(4) 密码:redis的密码功能较弱,同时多了一次IO
(5) 修改客户端源代码,禁止掉一些危险的命令(shutdown, flushall, monitor, keys *),当然还是可以通过redis-cli来完成
(6) 添加command-rename配置,将一些危险的命令(flushall, monitor, keys * , flushdb)做rename,如果有需要的话,找到redis的运维人员处理
  1. rename-command FLUSHALL "随机数"
  2. rename-command FLUSHDB "随机数"
  3. rename-command KEYS "随机数"
 
六、模拟实验:
1.  开启一个空的Redis(最简,直接redis-server)
  1. redis-server
    初始化内存使用量如下:
  1. # Memory
  2. used_memory:815072
  3. used_memory_human:795.97K
  4. used_memory_rss:7946240
  5. used_memory_peak:815912
  6. used_memory_peak_human:796.79K
  7. used_memory_lua:36864
  8. mem_fragmentation_ratio:9.75
  9. mem_allocator:jemalloc-3.6.0
    client缓冲区:
  1. # Clients
  2. connected_clients:1
  3. client_longest_output_list:0
  4. client_biggest_input_buf:0
  5. blocked_clients:0
2. 开启一个monitor:
  1. redis-cli -h 127.0.0.1 -p 6379 monitor
3. 使用redis-benchmark:
  1. redis-benchmark -h 127.0.0.1 -p 6379 -c 500 -n 200000
4. 观察
(1) info memory:内存一直增加,直到benchmark结束,monitor输出完毕,但是used_memory_peak_human(历史峰值)依然很高--观察附件中日志
(2)info clients: client_longest_output_list: 一直在增加,直到benchmark结束,monitor输出完毕,才变为0--观察附件中日志
(3)redis-cli -h host -p port client list | grep "monitor" omem一直很高,直到benchmark结束,monitor输出完毕,才变为0--观察附件中日志
监控脚本:
  1. while [ 1 == 1 ]
  2. do
  3. now=$(date "+%Y-%m-%d_%H:%M:%S")
  4. echo "=========================${now}==============================="
  5. echo " #Client-Monitor"
  6. redis-cli -h 127.0.0.1 -p 6379 client list | grep monitor
  7. redis-cli -h 127.0.0.1 -p 6379 info clients
  8. redis-cli -h 127.0.0.1 -p 6379 info memory
  9. #休息100毫秒
  10. usleep 100000
  11. done

完整的日志文件:

 部分日志:
  1. =========================2015-11-06_10:07:16===============================
  2. #Client-Monitor
  3. id=7 addr=127.0.0.1:56358 fd=6 name= age=91 idle=0 flags=O db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=4869 omem=133081288 events=rw cmd=monitor
  4. # Clients
  5. connected_clients:502
  6. client_longest_output_list:4869
  7. client_biggest_input_buf:0
  8. blocked_clients:0
  9. # Memory
  10. used_memory:174411224
  11. used_memory_human:166.33M
  12. used_memory_rss:161513472
  13. used_memory_peak:176974792
  14. used_memory_peak_human:168.78M
  15. used_memory_lua:36864
  16. mem_fragmentation_ratio:0.93
  17. mem_allocator:jemalloc-3.6.0

美团在Redis上踩过的一些坑-3.redis内存占用飙升(转载)的更多相关文章

  1. [转帖]美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题

    美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题 博客分类: redis 运维 redis clustercluster-node-timeoutfailover  转载请 ...

  2. [转帖]美团在Redis上踩过的一些坑-4.redis内存使用优化

    美团在Redis上踩过的一些坑-4.redis内存使用优化 博客分类: 运维 redis redisstringhash优化segment-hash  转载请注明出处哈:http://carlosfu ...

  3. [转帖]美团在Redis上踩过的一些坑-3.redis内存占用飙升

    美团在Redis上踩过的一些坑-3.redis内存占用飙升 博客分类: 运维 redis redismonitor内存突增client listinfo     转载请注明出处哈:http://car ...

  4. 美团在Redis上踩过的一些坑-目录(本人非美团)(转)

    来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分:    一.周期性出现connect timeout    二.redis bgrewriteaof问 ...

  5. [转帖]美团在Redis上踩过的一些坑-2.bgrewriteaof问题

    美团在Redis上踩过的一些坑-2.bgrewriteaof问题 博客分类: redis 运维 aofaof rewrite  转载请注明出处哈:http://carlosfu.iteye.com/b ...

  6. [转帖]美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout

    美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout 博客分类: redis 运维 jedisconnect timeoutnosqltcp  转载请注明出处哈:http ...

  7. Redis上踩过的一些坑

    来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...

  8. redis主从复制踩到的那些坑

    一.报错:* MASTER <-> SLAVE sync started # Error condition on socket for SYNC: No route to host解决: ...

  9. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

随机推荐

  1. jw player笔记二----修改logo

    一.修改HTML5模式下的logo 见http://blog.csdn.net/xiong_mao_1/article/details/17222757 二.修改FLASH模式下的logo IE7/8 ...

  2. php CI框架基础知识

    一. CI框架的MVC导图 二. CI框架目录文件介绍 (1)index.php  单入口         整个框架对外暴露的唯一访问文件 (2)application  应用文件(放置用户信息,用户 ...

  3. 【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]

    序列分割 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏. ...

  4. loj6043 「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    传送门:https://loj.ac/problem/6043 [题解] 我们考虑这是个置换,所以一定形成了很多不相交的环. 对于每个环,我们只能选一段.不选.选一段.不选这样交替下去. 显然只有偶环 ...

  5. 关于chkrootkit 检查 INFECTED: Possible Malicious Linux.Xor.DDoS installed

    chkrootkit检测时,发现一个Xor.DDoS内容,内容如下...Searching for Linux.Xor.DDoS ... INFECTED: Possible Malicious Li ...

  6. swt MouseAdapter

    Exception in thread "main" java.lang.Error: Unresolved compilation problem:     The method ...

  7. appium===报错adb server version (31) doesn’t match this client (39); killing…的解决办法

    当使用在cmd窗口调用adb shell命令的时候 提示如下: adb server version (31) doesn't match this client (39); killing...er ...

  8. Centos 7.2 双网卡绑定之踩坑

    线上服务器,安装centos7.2 x64最小化安装,需要做链路聚合,双网卡绑定.在centos 6.x 和 centos 7上测试都OK,于是直接开搞. 说明下,以下环境是在虚拟机中实现的: 系统: ...

  9. Servlet中使用 Last-Modified、Expires和Cache-Control

    long now = System.currentTimeMillis(); long expires = System.currentTimeMillis() + (1000 * 60 * minu ...

  10. selenium+python自动化77-autoit文件上传【转载】

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...