redis 内存信息及相关操作
简介
redis
是缓存数据库,比较依赖内存的使用情况。
可以通过INFO MEMORY
,查看内存的使用情况
解析
执行命令之后可以看到下面的值,其中没有注明单位的都是是字节(byte)为单位,_human
结尾的都是,转换成比较容易读取的单位:
# Memory
used_memory:720640 #分配的内存总量,以字节(byte)为单位
used_memory_human:703.75K
used_memory_rss:12599296 #从操作系统的角度,返回 Redis 已分配的内存总量。这个值和 top 、 ps 等命令的输出一致
used_memory_rss_human:12.02M
used_memory_peak:444919184 #内存消耗峰值
used_memory_peak_human:424.31M
used_memory_peak_perc:0.16% #内存达到峰值内存的百分比,计算方式为:(used_memory/ used_memory_peak) * 100%
used_memory_overhead:676040 #为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog
used_memory_startup:531728 #服务启动时消耗的内存
used_memory_dataset:44600 #数据占用的内存大小,即used_memory - used_memory_overhead
used_memory_dataset_perc:23.61% # 数据占用的内存大小的百分比,(used_memory_dataset/(used_memory-used_memory_startup)) * 100%
allocator_allocated:816648 #分配器分配的内存
allocator_active:1277952 #分配器活跃的内存
allocator_resident:8589312 #分配器常驻的内存
total_system_memory:16709812224 # 操作系统内存大小
total_system_memory_human:15.56G
used_memory_lua:37888 #Lua引擎所使用的内存大小
used_memory_lua_human:37.00K
used_memory_scripts:0 # 脚本所使用的内存大小
used_memory_scripts_human:0B
number_of_cached_scripts:0 # 缓存脚本的数量
maxmemory:2147483648 #最大内存限制
maxmemory_human:2.00G
maxmemory_policy:noeviction #达到maxmeory时的内存淘汰策略
allocator_frag_ratio:1.56 #分配器的碎片率
allocator_frag_bytes:461304 # 分配器的碎片大小
allocator_rss_ratio:6.72 # 分配器常驻内存比例
allocator_rss_bytes:7311360 # 分配器的常驻内存大小
rss_overhead_ratio:1.47 #常驻内存开销比例
rss_overhead_bytes:4009984 #常驻内存开销大小
mem_fragmentation_ratio:18.54 #碎片率(used_memory_rss / used_memory)
mem_fragmentation_bytes:11919680 #内存碎片大小
mem_not_counted_for_evict:634 #被驱逐的内存
mem_replication_backlog:0 #复制积压缓冲区内存
mem_clients_slaves:0 #slave节点客户端消耗内存
mem_clients_normal:143544 #所有常规客户端消耗内存
mem_aof_buffer:640 #AOF使用内存
mem_allocator:jemalloc-5.1.0 #内存分配器,在编译时选择
active_defrag_running:0 #0表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行
lazyfree_pending_objects:0 # 0表示不存在延迟释放的挂起对象数量
lazyfreed_objects:0 # 已延迟释放的对象数量
以上是redis6.2
版本的内存相关的参数,比较老的版本可能没有这么多参数。
内存相关操作
1、限制最大内存
使用redis
的时候最好能限制最大使用内存,防止被系统OOM
,导致服务出现异常;设置最大内存,可以自动根据配置的策略,自动清理key
,腾出内存空间。
但是需要注意的是,要确保缓存数据在其他地方也有保存,负责被自动清理掉是找不回来的。
可以直接在配置文件里面直接添加
maxmemory 4gb
也可以通过命令修改然后保存到配置文件(适合正在运行中的实例)
config set maxmemory 4gb;
config rewrite;
比较老的版本可能不支持gb
这种单位,只支持字节(byte),需要将4gb
转换成4*1024*1024*1024=4294967296
,然后再set
,config rewrite
就是为了修改配置文件的。
2、在集群中,发现主机的内存不够用了!
集群一般一台主机开启了多个实例,虽然使用内存used_memory
还没有达到max_memory
但是主机的内存使用率已经出现告警了。
可以通过INFO MEMORY
的mem_fragmentation_ratio
看出碎片比率,正常(1,1.6),大于比例说明内存碎片严重。
如果碎片率不高,就需要扩容机器了。
如果碎片率高,老版本可以重启一下从节点以释放内存碎片。
从redis4
开始可以手动开启自动清理内存碎片
config set activedefrag yes
默认没有开启,会影响性能。等内存降下记得关闭起来。
还有一个命令:
memory purge
此命令是手动清理内存碎片,以一个I/O事件的形式注册到主线程当中去执行。仅在使用jemalloc
作为分配器时才可用。
- 原文作者:Linux运维菜
- 原文链接:https://www.opcai.top/post/2021/2021-07/redis_memory_ops/
- 版权声明:本作品采用进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。