暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis内存碎片清理

数据库干货铺 2020-01-11
1727

当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片。那么,Redis的内存碎片可以清理么,该如何清理呢?

翻看了Redis的相关资料发现,Redis4版本之后开始支持内存碎片的清理,于是进行了一次测试,内容如下:

1.  搭建Redis

搭建一个Redis,版本为4.0.14.搭建步骤参考历史博文或微信公众号,步骤相对简单,没有太多幺蛾子,很快便可以搭建成功。

2.  插入一堆Key,使其内存占用很大

可以批量写一个循环,插入大量key。

3.  删除90%以上的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,相当高了

     

    4.  清理内存碎片

    默认情况下自动清理碎片的参数是关闭的,可以按如下命令查看

      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

          5. 查看内存分配情况

          此时也可以查看内存分配情况,其中重要的指标是查看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 ---

             

            6.  手动清理

            其实还可以手动清理,可以采用如下命令

              127.0.0.1:6379> memory purge
              OK

              7. 相关参数配置说明

              内存清理相关参数如下,可以使用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版本的内存碎片清理就测试完成了。


                精彩推荐:

                1.  MySQL不停地自动重启怎么办

                2.  升级python,就是这么简单

                3.  MySQL里trx_mysql_thread_id为0 的事务导致大量锁等待超时该咋整

                4.  mysql8.0新增用户及加密规则修改的那些事

                5.  Postgresql部署及简单操作

                6.  比hive快10倍的大数据查询利器-- presto

                7.  国产数据库部署初体验

                8.   监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

                9.   PostgreSQL主从复制--物理复制

                10. PostgreSQL主从复制--逻辑复制

                11.  MySQL从库生成大量小的relay log案例模拟

                12.  MySQL传统点位复制在线转为GTID模式复制


                最后修改时间:2020-05-26 11:12:12
                文章转载自数据库干货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论