redis4里面自带了内存整理,可以避免内存碎片率过大的问题。


使用命令: 

config set activedefrag yes


执行完上面的命令后,稍等片刻再查看碎片率:

redis-cli -p 6379 info | grep ratio



我们在线上遇到的问题:

127.0.0.1:7001> config set activedefrag yes

(error) ERR Active defragmentation cannot be enabled: it requires a Redis server compiled with a modified Jemalloc like the one shipped by default with the Redis source distribution

看这个报错提示,貌似是jemalloc的版本与redis需要的不一致


查看下报错机器的jemalloc的版本:

redis-cli -c -p 7000 | grep jemalloc 

mem_allocator:jemalloc-3.6.0

我们的机器的redis-server的版本是4.0.10的,和jemalloc的版本差异较大。



后续: 

    我们换一台全新编译的redis-server机器, 再次执行 config set activedefrag yes  发现不再报错了。 


示例:

127.0.0.1:7001> info memory
# Memory
used_memory:5505886616
used_memory_human:5.13G
used_memory_rss:8171044864
used_memory_rss_human:7.61G
used_memory_peak:7923672456
used_memory_peak_human:7.38G
used_memory_peak_perc:69.49%
used_memory_overhead:99658336
used_memory_startup:1534088
used_memory_dataset:5406228280
used_memory_dataset_perc:98.22%
total_system_memory:135076163584
total_system_memory_human:125.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:10737418240
maxmemory_human:10.00G
maxmemory_policy:volatile-lfu
mem_fragmentation_ratio:1.48
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0


127.0.0.1:7001> config set activedefrag yes


稍等一会,再看下结果,碎片率恢复了:
127.0.0.1:7001> info memory
# Memory
used_memory:5504344840
used_memory_human:5.13G
used_memory_rss:6649913344
used_memory_rss_human:6.19G
used_memory_peak:7923672456
used_memory_peak_human:7.38G
used_memory_peak_perc:69.47%
used_memory_overhead:99362374
used_memory_startup:1534088
used_memory_dataset:5404982466
used_memory_dataset_perc:98.22%
total_system_memory:135076163584
total_system_memory_human:125.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:10737418240
maxmemory_human:10.00G
maxmemory_policy:volatile-lfu
mem_fragmentation_ratio:1.21
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0


可以看到  mem_fragmentation_ratio 从1.48 降低到了1.21了



redis4 碎片整理相关的配置说明:

# Enabled active defragmentation
# 碎片整理总开关
# activedefrag yes

# Minimum amount of fragmentation waste to start active defrag
# 内存碎片达到多少的时候开启整理
active-defrag-ignore-bytes 100mb

# Minimum percentage of fragmentation to start active defrag
# 碎片率达到百分之多少开启整理
active-defrag-threshold-lower 30

# Maximum percentage of fragmentation at which we use maximum effort
# 碎片率小余多少百分比开启整理
active-defrag-threshold-upper 100

# Minimal effort for defrag in CPU percentage
active-defrag-cycle-min 25

# Maximal effort for defrag in CPU percentage
active-defrag-cycle-max 75