当redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片。那么,Redis的内存碎片可以清理么,该如何清理呢?
翻看了Redis的相关资料发现,Redis4版本之后开始支持内存碎片的清理,于是进行了一次测试,内容如下:
搭建一个Redis,版本为4.0.14.搭建步骤参考历史博文或微信公众号,步骤相对简单,没有太多幺蛾子,很快便可以搭建成功。
可以批量写一个循环,插入大量key。
循环删除key或在创建key时设置过期时间,待key删除或过期之后,可以查看内存的情况。
127.0.0.1:6379> info memory
# Memory
used_memory:137040696
used_memory_human:130.69M
used_memory_rss:11705876480
used_memory_rss_human:10.90G
used_memory_peak:12091169848
used_memory_peak_human:11.26G
used_memory_peak_perc:1.13%
used_memory_overhead:3473184
used_memory_startup:786648
used_memory_dataset:133567512
used_memory_dataset_perc:98.03%
total_system_memory:16862617600
total_system_memory_human:15.70G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:12000000000
maxmemory_human:11.18G
maxmemory_policy:noeviction
mem_fragmentation_ratio:85.42
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
可以发现实际使用内存为130.69M,而Redis申请的内存为10.90G,碎片率mem_fragmentation_ratio为85.42,相当高了。
默认情况下自动清理碎片的参数是关闭的,可以按如下命令查看。
127.0.0.1:6379> config get activedefrag
1) "activedefrag"
2) "no"
启动自动清理内存碎片。
127.0.0.1:6379> config set activedefrag yes
OK
开启后再查看内存信息。
127.0.0.1:6379> info memory
# Memory
used_memory:138029408
used_memory_human:131.64M
used_memory_rss:5052907520
used_memory_rss_human:4.71G
used_memory_peak:12091169848
used_memory_peak_human:11.26G
used_memory_peak_perc:1.14%
used_memory_overhead:3752728
used_memory_startup:786648
used_memory_dataset:134276680
used_memory_dataset_perc:97.84%
total_system_memory:16862617600
total_system_memory_human:15.70G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:12000000000
maxmemory_human:11.18G
maxmemory_policy:noeviction
mem_fragmentation_ratio:36.61
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
此时redis占用的内存used_memory_rss已降低至4.71G了,内存碎片为36.61。
此时也可以查看内存分配情况,其中重要的指标是查看bins里的util,此时可以发现当前最大的已达到0.998(1除外)。
127.0.0.1:6379> memory malloc-stats
___ Begin jemalloc statistics ___
Version: 4.0.3-0-ge9192eacf8935e29fc62fddc2701f7942b1cc02c
Assertions disabled
Run-time option settings:
opt.abort: false
opt.lg_chunk: 21
opt.dss: "secondary"
opt.narenas: 8
opt.lg_dirty_mult: 3 (arenas.lg_dirty_mult: 3)
opt.stats_print: false
opt.junk: "false"
opt.quarantine: 0
opt.redzone: false
opt.zero: false
opt.tcache: true
opt.lg_tcache_max: 15
CPUs: 2
Arenas: 8
Pointer size: 8
Quantum size: 8
Page size: 4096
Min active:dirty page ratio per arena: 8:1
Maximum thread-cached size class: 32768
Chunk size: 2097152 (2^21)
Allocated: 138983464, active: 149237760, metadata: 133846144, resident: 299532288, mApped: 5274861568
Current active ceiling: 153092096
arenas[0]:
assigned threads: 1
dss allocation precedence: secondary
min active:dirty page ratio: 8:1
dirty pages: 36435:4043 active:dirty, 348100 sweeps, 737670 madvises, 4686933 purged
allocated nmalloc ndalloc nrequests
small: 51173416 27946257 27800354 215995984
large: 20701184 6397067 6396713 7682104
huge: 67108864 754 753 754
total: 138983464 34344078 34197820 223678842
active: 149237760
mapped: 5270667264
metadata: mapped: 130830336, allocated: 115776
bins: size ind allocated nmalloc ndalloc nrequests curregs curruns regs pgs util nfills nflushes newruns reruns
8 0 2952 4753 4384 18226389 369 1 512 1 0.720 2600 2566 1 0
16 1 699600 5702102 5658377 34777916 43725 392 256 1 0.435 61712 64807 22136 251
24 2 824592 9648532 9614174 75492339 34358 441 512 3 0.152 102398 100732 16561 1083971
32 3 800 1828 1803 11077167 25 1 128 1 0.195 1031 883 1 0
40 4 400 893 883 1285046 10 1 512 5 0.019 787 791 1 0
48 5 1824 10123 10085 23813168 38 1 256 3 0.148 6390 7039 18 9
56 6 11200 665763 665563 3654283 200 60 512 7 0.006 11325 18434 1302 135
64 7 44480 2221901 2221206 8140167 695 62 64 1 0.175 38634 43809 34702 1105
80 8 2243120 3241050 3213011 12640545 28039 154 256 5 0.711 36308 40673 12556 268
96 9 1248384 1173523 1160519 5632612 13004 116 128 3 0.875 17234 22442 9049 828
112 10 257152 497094 494798 378079 2296 9 256 7 0.996 10382 20700 1942 529
128 11 173056 241148 239796 1500956 1352 43 32 1 0.982 11994 19268 7491 1149
160 12 510880 676589 673396 1867045 3193 25 128 5 0.997 12036 20344 5279 974
192 13 86784 163154 162702 104853 452 8 64 3 0.882 8095 19909 2538 885
224 14 1050784 937414 932723 882636 4691 37 128 7 0.990 14534 21327 7237 653
256 15 177920 122377 121682 108334 695 44 16 1 0.987 11216 18094 7648 1025
320 16 158720 160687 160191 1395080 496 10 64 5 0.775 8282 19932 2458 806
384 17 108288 87166 86884 56781 282 10 32 3 0.881 7364 18594 2691 830
448 18 520576 311865 310703 235276 1162 19 64 7 0.955 9885 20257 4849 1277
512 19 366080 139077 138362 136708 715 91 8 1 0.982 16677 21203 17307 758
640 20 296320 136674 136211 1387569 463 15 32 5 0.964 8781 19327 4294 1194
768 21 754176 164055 163073 154637 982 62 16 3 0.989 13751 19514 10232 853
896 22 507136 142840 142274 104081 566 19 32 7 0.930 8831 19297 4488 1232
1024 23 460800 81240 80790 71715 450 113 4 1 0.995 11411 17538 20204 1932
1280 24 967680 142375 141619 3997592 756 48 16 5 0.984 12880 19162 8852 974
1536 25 806400 83240 82715 1363965 525 66 8 3 0.994 11744 17875 10296 1083
1792 26 507136 70931 70648 50310 283 18 16 7 0.982 8140 17915 4403 1138
2048 27 540672 52915 52651 40011 264 132 2 1 1 8604 16582 26425 1888
2560 28 1487360 115947 115366 2688774 581 73 8 5 0.994 15012 19969 14410 962
3072 29 1022976 70646 70313 58822 333 84 4 3 0.991 10445 17189 17546 2050
3584 30 1634304 76807 76351 66030 456 57 8 7 1 11190 17542 9538 1175
4096 31 487424 56959 56840 43668 119 119 1 1 1 9176 16863 56959 0
5120 32 6154240 145461 144259 2675097 1202 301 4 5 0.998 17704 22138 36076 1483
6144 33 1198080 45380 45185 83315 195 98 2 3 0.994 8050 16148 22721 1759
7168 34 824320 32518 32403 1310845 115 29 4 7 0.991 6598 14416 8063 1715
8192 35 18800640 355210 352915 362972 2295 2295 1 2 1 39103 42128 355210 0
10240 36 2232320 76168 75950 66295 218 109 2 5 1 11960 17361 37917 1769
12288 37 2039808 52860 52694 40296 166 166 1 3 1 8941 16632 52860 0
14336 38 1964032 36992 36855 24610 137 69 2 7 0.992 6879 15285 18422 1777
large: size ind allocated nmalloc ndalloc nrequests curruns
16384 39 688128 7548 7506 7760 42
20480 40 880640 9391 9348 1293561 43
24576 41 688128 6279 6251 6367 28
28672 42 602112 4187 4166 4261 21
32768 43 2818048 17937 17851 18430 86
40960 44 1433600 6306450 6306415 6306450 35
49152 45 1277952 5117 5091 5117 26
57344 46 860160 5916 5901 5916 15
65536 47 393216 2953 2947 2953 6
81920 48 1310720 8244 8228 8244 16
98304 49 294912 5037 5034 5037 3
114688 50 573440 4224 4219 4224 5
131072 51 393216 2233 2230 2233 3
163840 52 1638400 2798 2788 2798 10
196608 53 1179648 1740 1734 1740 6
229376 54 229376 1162 1161 1162 1
262144 55 524288 872 870 872 2
327680 56 327680 1290 1289 1290 1
393216 57 0 782 782 782 0
458752 58 0 520 520 520 0
524288 59 524288 400 399 400 1
655360 60 655360 606 605 606 1
786432 61 0 371 371 371 0
917504 62 0 196 196 196 0
1048576 63 2097152 224 222 224 2
1310720 64 1310720 328 327 328 1
1572864 65 0 179 179 179 0
1835008 66 0 83 83 83 0
huge: size ind allocated nmalloc ndalloc nrequests curhchunks
2097152 67 0 110 110 110 0
2621440 68 0 263 263 263 0
3145728 69 0 86 86 86 0
3670016 70 0 91 91 91 0
4194304 71 0 45 45 45 0
5242880 72 0 55 55 55 0
6291456 73 0 26 26 26 0
7340032 74 0 15 15 15 0
8388608 75 0 13 13 13 0
10485760 76 0 8 8 8 0
12582912 77 0 13 13 13 0
14680064 78 0 2 2 2 0
16777216 79 0 4 4 4 0
20971520 80 0 2 2 2 0
25165824 81 0 2 2 2 0
29360128 82 0 2 2 2 0
33554432 83 0 4 4 4 0
41943040 84 0 2 2 2 0
50331648 85 0 2 2 2 0
58720256 86 0 2 2 2 0
67108864 87 67108864 7 6 7 1
---
--- End jemalloc statistics ---
其实还可以手动清理,可以采用如下命令
127.0.0.1:6379> memory purge
内存清理相关参数如下,可以使用config get的方式查看对应的值。
# 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 10
# 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
至此,Redis4.0.14版本的内存碎片清理就测试完成了。