一次Redis内存排查记录
1. 起因
萌叔手上有一个测试用的Redis集群,集群是Master-slave模式,
平常也不怎么使用。 于是打算清理释放一下内存,打算降低一下配置。
使用FLUSHALL
FLUSHALL
可以看到所有的key都已经被清空
> info Keyspace
# Keyspace
查看内存开销情况
> info memory
# Memory
used_memory:537921192
used_memory_human:513.00M
used_memory_rss:544067584
used_memory_rss_human:518.86M
used_memory_peak:650406864
实例的内存开销超过500MB,内存让狗吃了?
2. 排查
# Memory
used_memory:537921192
used_memory_human:513.00M
used_memory_rss:544067584
used_memory_rss_human:518.86M
used_memory_peak:650406864
used_memory_peak_human:620.28M
used_memory_peak_perc:82.71%
used_memory_overhead:537863648
used_memory_startup:791600
used_memory_dataset:57544
used_memory_dataset_perc:0.01%
allocator_allocated:537984728
allocator_active:538705920
allocator_resident:548462592
total_system_memory:201219264512
total_system_memory_human:187.40G
used_memory_lua:40960
used_memory_lua_human:40.00K
used_memory_scripts:216
used_memory_scripts_human:216B
number_of_cached_scripts:1
maxmemory:1073741824
maxmemory_human:1.00G
maxmemory_policy:allkeys-lru
allocator_frag_ratio:1.00
allocator_frag_bytes:721192
allocator_rss_ratio:1.02
allocator_rss_bytes:9756672
rss_overhead_ratio:0.99
rss_overhead_bytes:-4395008
mem_fragmentation_ratio:1.01
mem_fragmentation_bytes:6229608
mem_not_counted_for_evict:0
mem_replication_backlog:536870912 // 约为512MB
mem_clients_slaves:16922
mem_clients_normal:183998
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.88.29,port=9981,state=online,offset=23482674189,lag=0
master_replid:b58677283938996fdae00f7692d24d11d88ff488
master_replid2:effdd3cd4ab2030a2d49273e0cf2ed74df4bccb9
master_repl_offset:23482674347
second_repl_offset:17046600529
repl_backlog_active:1
repl_backlog_size:536870912 // 约为512MB
repl_backlog_first_byte_offset:22945803436
repl_backlog_histlen:536870912
# Cluster
cluster_enabled:0
# Keyspace
将INFO命令返回的所有内容都交给chatGPT分析,笔者找到了答案,主要原因是复制积压缓冲区设置的过大。
什么是复制积压缓冲区?
复制积压缓冲区(Replication Backlog) 是 Redis 主从复制机制中的一个关键组件。
当主节点有从节点连接时,主节点会维护一个固定大小的环形缓冲区,用于保存最近写入的命令。
这个缓冲区的主要作用是支持从节点在短暂断开后快速重新同步,而不需要进行完整的同步过程,从而提高复制的效率和稳定性。
默认情况下,Redis 的复制积压缓冲区大小为 1MB。但在这个配置中,这个值被设置为 512MB。
3. 处理
3.1 临时调整,重启后失效
CONFIG SET repl-backlog-size 52428800
3.1 永久设置
在配置文件中添加并重启实例
repl-backlog-size 50mb
作者: vearne
文章标题: 一次Redis内存排查记录
发表时间: 2024年9月11日
文章链接: https://vearne.cc/archives/40174
版权说明: CC BY-NC-ND 4.0 DEED