`
carlosfu
  • 浏览: 584740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ba8b5055-9c58-3ab0-8a1c-e710f0495d2c
BigMemory实战与理...
浏览量:31586
53b2087e-c637-34d2-b61d-257846f73ade
RedisCluster开...
浏览量:151372
C9f66038-7478-3388-8086-d20c1f535495
缓存的使用与设计
浏览量:125785
社区版块
存档分类
最新评论

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

阅读更多
  

   转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154

  更多Redis的开发、运维、架构以及新动态,欢迎关注微信公众号:

 


    


 一、现象:
    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做限制,但是官方也不建议这么做,官方的默认配置中对于输出缓冲区没有限制。
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的运维人员处理
rename-command FLUSHALL "随机数"
rename-command FLUSHDB "随机数"
rename-command KEYS "随机数"
 
六、模拟实验:
1.  开启一个空的Redis(最简,直接redis-server)
redis-server
    初始化内存使用量如下:
# Memory
used_memory:815072
used_memory_human:795.97K
used_memory_rss:7946240
used_memory_peak:815912
used_memory_peak_human:796.79K
used_memory_lua:36864
mem_fragmentation_ratio:9.75
mem_allocator:jemalloc-3.6.0
    client缓冲区:
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
 
2. 开启一个monitor:
redis-cli -h 127.0.0.1 -p 6379 monitor
3. 使用redis-benchmark:
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--观察附件中日志
监控脚本:
while [ 1 == 1 ]
do
now=$(date "+%Y-%m-%d_%H:%M:%S")
echo "=========================${now}==============================="
echo " #Client-Monitor"
redis-cli -h 127.0.0.1 -p 6379 client list | grep monitor
redis-cli -h 127.0.0.1 -p 6379 info clients
redis-cli -h 127.0.0.1 -p 6379 info memory
#休息100毫秒
usleep 100000
done
 完整的日志文件:
 部分日志:
=========================2015-11-06_10:07:16===============================
 #Client-Monitor
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
# Clients
connected_clients:502
client_longest_output_list:4869
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:174411224
used_memory_human:166.33M
used_memory_rss:161513472
used_memory_peak:176974792
used_memory_peak_human:168.78M
used_memory_lua:36864
mem_fragmentation_ratio:0.93
mem_allocator:jemalloc-3.6.0
  
 
 
  • 大小: 271.1 KB
  • 大小: 49.7 KB
  • 大小: 41.5 KB
  • 大小: 15 KB
分享到:
评论

相关推荐

    redis-5.0.14-1.el7.remi.x86-64.rpm安装包(含有部署手册)

    redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm安装包(含有部署手册) redis-5.0.14-1.el7.remi.x86_64.rpm...

    redis-5.0.5.tar.gz

    redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-...

    redis-3.2.2.gem redis-3.2.2.gem redis-3.2.2.gem

    这个压缩包"redis-3.2.2.gem"包含的是Redis 3.2.2版本的源代码或者安装包,主要用于在Ruby环境中安装和使用Redis。Ruby社区使用gem作为包管理器,它允许开发者方便地管理和部署Ruby应用程序的依赖。 Redis 3.2.2是...

    Redis-x64-3.2.100.zip

    3. **在Windows上部署Redis**: - 安装服务:使用`redis.windows-service.conf`配置文件创建Redis服务,通过命令行工具`sc create`或使用`redis-server.exe --service-install`命令实现。 - 配置服务:根据需求...

    redis-6.2.6-x64-windows.zip

    3. **编译过程**:在Windows上安装Redis需要编译源代码。这个压缩包已经完成了编译步骤,用户可以直接使用,无需关心编译环境和依赖库。 4. **安装与配置**:解压后,用户需要将`redis-server.exe`作为服务启动,...

    Redis-x64-5.0.14.1.msi

    总结来说,Redis-x64-5.0.14.1.msi 是 Redis 在 Windows 平台上的安装包,提供了高效的数据存储和处理能力,适用于各种应用场景,如缓存、计数器、发布订阅等。正确安装并配置 Redis,可以极大地提升应用程序的响应...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    在Redis-x64-5.0.14.1版本中,可能包括以下内容: - `redis-server`: Redis服务器进程,负责处理客户端请求。 - `redis-cli`: 官方提供的命令行客户端,用于与Redis服务器交互。 - `redis.conf`: 默认配置文件,...

    Redis-x64-5.0.14.1

    - 可以通过`redis-benchmark.exe`进行性能测试,评估Redis在当前配置下的性能表现。 - 使用`redis-check-aof.exe`和`redis-check-rdb.exe`定期检查数据文件的完整性,确保数据安全。 5. **注意事项**: - ...

    RedisDesktopManager Windows版 redis-desktop-manager-0.9.3.817.zip

    通过这个压缩包中的"redis-desktop-manager-0.9.3.817.exe"文件,用户可以安装和运行RedisDesktopManager。该可执行文件是经过编译的Windows程序,包含了所有必要的库和资源,使得用户无需额外配置环境即可直接使用...

    最新版windows Redis-x64-5.0.14.1.zip

    压缩包内的文件"Redis-x64-5.0.14.1.msi"是一个Windows Installer包,用于在Windows操作系统上安装Redis服务器。安装过程中,系统会自动配置必要的环境变量和启动服务,以便用户能轻松地管理和使用Redis。 安装完成...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    2. **服务化**:为了使Redis在系统启动时自动运行,可以将`redis-server.exe`配置为Windows服务。这可以通过命令行工具`sc create`或使用`.msi`安装包实现。 3. **数据持久化**:Redis支持多种持久化方式,包括RDB...

    Redis-x64-3.2.100.zip安装包分享给需要的同学

    Redis-x64-3.2.100.zip安装包分享给需要的同学

    Redis-x64-5.0.14.1.msi 安装包

    Redis-x64-5.0.14.1.msi 是 Redis 的一个64位Windows安装包,版本为5.0.14。Redis 是一个开源的、高性能的键值存储系统,它常被用作数据库、缓存和消息代理。这个安装包使得在Windows环境下部署Redis变得更加简便。...

    Redis windows下载 Redis-x64-3.2.100.zip

    redis-server --service-install redis.windows-service.conf --loglevel verbose 2 常用的redis服务命令。 卸载服务:redis-server --service-uninstall 开启服务:redis-server --service-start 停止服务:redis-...

    Redis-x64-5.0.14.1.zip

    在你提供的压缩包"Redis-x64-5.0.14.1.zip"中,包含的是Redis 5.0.14的64位Windows版本。解压这个文件后,你会得到以下关键组件: 1. **redis-server.exe**:这是Redis服务器的执行文件,用于启动Redis服务。当你...

    redis+redis-desktop-manager-0.8.3.3850+笔记

    Redis,全名Remote Dictionary Server,是一款开源的高性能键值对存储系统,它支持数据的持久化,可以将内存中的数据保存在磁盘上,同时提供了丰富的数据类型,如字符串、哈希表、列表、集合和有序集合。Redis以网络...

Global site tag (gtag.js) - Google Analytics