ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis内存溢出:OOM command not allowed when used memory > ‘maxmemory‘

2021-06-11 21:01:43  阅读:399  来源: 互联网

标签:used human OOM maxmemory when 内存 key memory


目录

背景

排查步骤

改进


背景

最近sit环境的redis服务器出现了报错信息:XXX失败: OOM command not allowed when used memory > 'maxmemory'.,初步设想是redis内存溢出,导致key无法插入

 

排查步骤

  1. 登录redis客户端,通过 ./redis-cli -h IP -p port -a passwd 或者 RedisDesktopManager
  2. 输入命令行:info memory 查看内存信息
Connected.
xx.x.xx.x@sit:0>info memory
"# Memory
used_memory:915574200      #由Redis分配器分配的内存总量,包含redis进程内部的开销和数据占用的内存(所有key及其value占用的内存)
used_memory_human:873.16M
used_memory_rss:1051254784   #从操作系统的角度,返回Redis已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致
used_memory_rss_human:1002.55M
used_memory_peak:4297736416   #Redis的内存消耗峰值(字节单位) 
used_memory_peak_human:4.00G
used_memory_peak_perc:21.30%    # 使用内存与峰值内存的百分比(used_memory / used_memory_peak) *100%
used_memory_overhead:43275440    # Redis维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog
used_memory_startup:35352360     # Redis启动完成使用的内存
used_memory_dataset:872298760    # 数据占用的内存(used_memory-used_memory_overhead)
used_memory_dataset_perc:99.10%   # 数据占用的内存大小百分比,(used_memory_dataset / (used_memory - used_memory_startup))*100%
total_system_memory:403513290752  # 主机内存总量(byte)
total_system_memory_human:375.80G
used_memory_lua:47104             # Lua引擎存储占用的内存(byte)
used_memory_lua_human:46.00K
maxmemory:4294967296            # 配置中设置的最大可使用内存值(byte),默认0,不限制
maxmemory_human:4.00G           
maxmemory_policy:noeviction      # 当达到maxmemory时key的淘汰策略
mem_fragmentation_ratio:1.15       # 碎片率(used_memory_rss / used_memory),正常(1,1.6),大于比例说明内存碎片严重
mem_allocator:jemalloc-4.0.3      # 内存分配器
active_defrag_running:0           # 活动碎片整理是否处于活动状态(0没有,1正在运行)
lazyfree_pending_objects:0        # 0-不存在延迟释放的挂起对象

备注:redis的 info memory命令信息详解:https://blog.csdn.net/lingeio/article/details/104670927/

   3.观察主要指标:

    used_memory_peak_human 内存峰值,maxmemory 最大内存基本持平,used_memory_dataset_perc 达到99.10%,key没释放内存,

     主要原因有maxmemory_policy内存淘汰策略为noeviction 永不过期,返回错误,永远不会淘汰key

改进

Redis的maxmemory_policy内存淘汰策略有:

1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)

2、allkeys-lru : 删除lru算法的key

3、volatile-random:随机删除即将过期key

4、allkeys-random:随机删除

5、volatile-ttl : 删除即将过期的

6、noeviction : 永不过期,返回错误

改进方式有:

a. 将 maxmemory_policy设置为allkeys-lru : 删除lru算法的key ,将最近未被使用的key删除掉,

b.考虑对redis扩容 然后在代码里维护key的删除

标签:used,human,OOM,maxmemory,when,内存,key,memory
来源: https://blog.csdn.net/jackhuang17/article/details/117826581

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有