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