内存碎片指在内存分配使用过程中,产生的不能被重复利用的内存空间。以下图为例,内存空间还有3K,应用程序想申请3K连续空间,虽然总量够,但是仍然会申请失败。对于这种无法利用的空间,称之为内存碎片。内存碎片会占用操作系统分配给redis的内存空间,严重影响性能。

 内存碎片形成原因

        1.内存分配策略引发:redis默认使用jemalloc分配器分配内存。jemalloc每次分配2*N固定空间,例如写入数据申请10K空间,jemalloc会为其分配16K空间。这样分配优点是下次写入>=6K数据不用再申请内存空间,缺点是造成内存浪费。

        2.修改内存中数据:修改包括增加和减少内存占用。例如原来占用16K空间的数据,增加或减少1K都会造成内存碎片

内存碎片查看

info memory  查看redis内存使用情况,主要关注以下参数


used_memory: redis分配的内存总量单位为b
used_memory_human: redis分配的内存总量单位为M
used_memory_rss: redis向操作系统申请的内存总量单位为b
used_memory_rss_human:redis向操作系统申请的内存总量单位为M
mem_fragmentation_ratio:内存碎片率
mem_allocator:jemalloc-5.1.0 内存分配器


mem_fragmentation_ratio计算公式为:used_memory_rss/used_memory该值过高时考虑清理内存,例如该值为2表示有50%空间浪费






内存碎片清理   

        内存碎片清理就是将原本不连续的内存空间重新整理为连续空间,由于redis是单线程的,在清理过程中会造成阻塞,降低性能。可以通过手动清理,自动清理,同时重启redis也会清理内存碎片

手动清理内存碎片

memory purge 只支持jemalloc内存分配器

自动清理内存碎片

修改redis.conf配置文件
activedefrag yes 开启自动清理内存碎片

active-defrag-ignore-bytes 100mb 内存碎片的字节数达到100M时开始清理

active-defrag-threshold-lower 10 内存碎片空间占操作系统分配给redis的总空间比例达到 10% 时开始清理

active-defrag-ignore-bytes与active-defrag-threshold-lower两个条件同时满足会触发内存碎片清理,当有一个不满足则停止清理

active-defrag-threshold-upper 100 内存碎片超过 100%,则尽最大努力整理

active-defrag-cycle-min 1 自动清理过程所用CPU时间的比例不低于1%,保证能正常清理

active-defrag-cycle-max 25 自动清理过程所用CPU时间的比例不高于25%,超过25%停止清理,避免redis主线程阻塞

active-defrag-max-scan-fields 1000 自动清理过程中长度小于1000的set/hash/zset/list才会进行自动清理

以上参数默认注释

        刚才提到重启也会清理内存碎片,但是没这么干的,不可能线上内存碎片过高了就重启一次,而且如果数据没落盘重启后会造成数据丢失。即使落盘了,重启后还要通过AOF或RDB回复数据,如果数据量很大恢复也慢,此时redis无法对外界提供服务。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐