常规排查操作
1、Redis-cli命令行界面访问到Redis服务器
2、输入info memory命令,返回与内存相关的数据。
used_memory:由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位
used_memory_human:已更直观的单位展示分配的内存总量。
used_memory_rss:向操作系统申请的内存大小。与 top 、 ps等命令的输出一致。
used_memory_rss_human:已更直观的单位展示向操作系统申请的内存大小。
used_memory_peak:redis的内存消耗峰值(以字节为单位)
used_memory_peak_human:以更直观的格式返回redis的内存消耗峰值
total_system_memory:整个系统内存
total_system_memory_human:以更直观的格式显示整个系统内存
used_memory_lua:Lua脚本存储占用的内存
used_memory_lua_human:以更直观的格式显示Lua脚本存储占用的内存
maxmemory:Redis实例的最大内存配置
maxmemory_human:以更直观的格式显示Redis实例的最大内存配置
maxmemory_policy:当达到maxmemory时的淘汰策略
mem_fragmentation_ratio:碎片率,used_memory_rss/ used_memory
mem_allocator:内存分配器
当内存使用达到设置的最大阀值时,需要选择一种key的回收策略,可在Redis.conf配置文件中修改“maxmemory-policy”属性值。 Redis 淘汰策略,如下:
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据。
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰。
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰。
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据。
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据。
若是Redis数据集中的key都设置了过期时间,那么“volatile-ttl”策略是比较好的选择。但如果key在达到最大内存限制时没能够迅速过期,或者根本没有设置过期时间。那么设置为“allkeys-lru”值比较合适,它允许Redis从整个数据集中挑选最近最少使用的key进行删除(LRU淘汰算法)。
异常:占用内存飙升
1、 redis-cli -h 192.168.0.151 -p 6379
2、执行 info
观察info信息,clients:有一点引起了怀疑: client_longes_output_list有些异常高。
服务端和客户端交互时,分别为每个客户端设置了输入缓冲区和输出缓冲区,这部分如果很大的话也会占用Redis服务器的内存。
client_longest_output_list高,应该是输出缓冲区占用内存较大,也就是有大量的数据从Redis服务器向某些客户端输出。
3、执行client list命令 redis-cli -h host -p port client list | grep -v "omem=0"
来查询输出缓冲区不为0的客户端连接,于是查询到祸首monitor。
monitor的模型是这样的,它会将所有在Redis服务器执行的命令进行输出,通常来讲Redis服务器的QPS是很高的,也就是如果执行了monitor命令,Redis服务器在Monitor这个客户端的输出缓冲区又会有大量“存货”,也就占用了大量Redis内存。
4、执行ps -ef | grep monitor,查找对应进程,关闭掉monitor命令的进程