1 redis 的碎片率
1.1 碎片是什么,怎么产生的?
内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。产生内存碎片的方法很简单,举个例:
假设有一块一共有100个单位的连续空闲内存空间,范围是099。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为09区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10~14区间。 如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。 现在整个内存空间的状态是09空闲,1014被占用,1524被占用,2599空闲。其中09就是一个内存碎片了。如果1014一直被占用,而以后申请的空间都大于10个单位,那么0~9就永远用不上了,造成内存浪费。 如果你每次申请内存的大小,都比前一次释放的内村大小要小,那么就申请就总能成功。
1.2 redis的内存碎片
mem_fragmentation_ratio
= used_memory_rss
/ used_memory
used_memory
:Redis使用其分配器分配的内存大小
used_memory_rss
:操作系统分配给Redis实例的内存大小,表示该进程所占物理内存的大小
两者包括了实际缓存占用的内存和Redis自身运行所占用的内存,used_memory_rss指标还包含了内存碎片的开销,内存碎片是由操作系统低效的分配/回收物理内存导致的。
mem_fragmentation_ratio < 1 表示Redis内存分配超出了物理内存,操作系统正在进行内存交换,内存交换会引起非常明显的响应延迟;
mem_fragmentation_ratio > 1 是合理的;
mem_fragmentation_ratio > 1.5 说明Redis消耗了实际需要物理内存的150%以上,其中50%是内存碎片率,可能是操作系统或Redis实例中内存管理变差的表现
redis-cli info 可以查看到redis内存使用信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j10uJVqo-1606206126983)(C:\Users\hydee\AppData\Roaming\Typora\typora-user-images\image-20201110111233270.png)]
1.2 redis内存碎片有什么影响?
a. 碎片率越高说明redis内存的利用率不高,并且随着碎片增加,会消耗更多的系统内存。
b. 碎片高说明可能频繁的进行回收内存了,key经常需要回收,会使客户端命令响应延迟时间增加,因为Redis不但要处理客户端过来的命令请求,还要频繁的回收满足条件的key
1.3 怎么解决碎片问题?
1、重启redis服务
2、手动回收内存碎片
- Redis 4.0-RC3 以上版本才支持的
- 需要使用jemalloc作为内存分配器(默认的)
- 支持在运行期进行自动内存碎片清理 (config set activedefrag yes)
- 支持通过命令 memory purge 进行清理(与自动清理区域不同)
- https://www.cnblogs.com/huaiyinxiaojiang/p/7298780.html 内存碎片是什么
- https://blog.csdn.net/my_tiantian/article/details/84333716 redis内存碎片
- https://zhuanlan.zhihu.com/p/67381368
- https://www.cnblogs.com/grimm/p/10288116.html
- https://www.cnblogs.com/gjc592/p/12180024.html