一、Redis 内存碎片
内存碎片是指在内存分配的时候,产生的不能重复利用的空间。例如,内存空间还有3K,应用程序想申请连续的3K空间,虽然内存空间够,但是空间分配为2K,1K,总空间够,但是不连续,导致应用程序申请失败,这种无法利用的内存空间称之为"内存碎片"。内存分片会占用操作系统分配给redis的内存空间,严重影响redis性能。
二、内存碎片形成原因
1.内因
内存分片策略引发:redis默认使用jemalloc分配器分配内存。jemalloc每次分配2*N固定空间,例如写入数据申请10K空间,jemalloc会分配16K空间,优点:下次写入>=6K数据不需要申请内存空间,缺点造成内存浪费。
2.外因
修改内存中数据:修改包括增加和减少内存占用,例如原来的16K空间数据,增加或减少1K都会造成内存浪费。大量内存碎片的存在,会造成redis实际内存使用率降低,影响性能。
三、查看内存碎片
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 该值大于1但小于1.5。这种情况是合理的。该值过高时考虑清理内存,例如该值大于1.5表示有50%空间浪费,需要清理内存碎片。
四、内存碎片清理
内存碎片清理,就是将不连续的内存空间重新整理为连续空间,由于redis是单线程,在清理过程中会造成堵塞,降低性能。可通过以下三种方式清理:
1.手动清理内存碎片
memory purge 只支持jemalloc内存分配器
2.自动清理
修改redis.conf配置文件
1 2 3 4 5 6 7 8 |
|
----以上参数默认注释----
3.重启redis
到此这篇关于Redis 内存碎片原因及清理的文章就介绍到这了。