赞
踩
在使用CacheCloud时看到一个碎片率的监控指标,于是有了此文。
内存碎片率,memory fragmentation ratio,MFR,Redis的一个性能指标,其计算公式:MFR=used_memory_rss/used_memory
无论是通过redis-cli
还是RDM工具,输入info
或更具体的info memory
命令,即可得到如下信息:
used_memory:15288560
used_memory_human:14.58M
used_memory_rss:14237696
used_memory_rss_human:13.58M
mem_fragmentation_ratio:0.93
mem_allocator:jemalloc-3.6.0
输出参数:
另外,当内存使用量(used_memory)很小的时候,这个值参考价值不大。所以,建议used_memory至少1G以上才考虑对内存碎片率进行监控。
碎片整理允许Redis压缩内存空间,从而回收内存。
分析实际环境,因为该redis主要是存储频繁更新的数据,每次更新数据之前,redis会删除旧的数据,实际上,由于Redis释放了内存块,但内存分配器并没有返回内存给操作系统,这个内存分配器是在编译时指定的,可以是libc、jemalloc或者tcmalloc。used_memory_rss会越来越大,导致MFR越来越高。
当Redis中清理大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片。
redis产生内存碎片有两个原因,
进程需要用内存的话,会先通过OS向device申请,然后才能够使用。一般进程在不需要使用的时候,会释放掉这部分内存并返回给device。但是redis作者可能为了更高的性能,所以在redis中实现了自己的内存分配器来管理内存,不会马上返还内存,不用每次都向OS申请了,从而实现高性能。
但是,在内存分配器的那张图片我们知道,redis的每个k-v对初始化的内存大小是最适合的,当这个value改变的并且原来内存大小不适用的时候,就需要重新分配内存了。(但是value存比原来小不知道会不会产生碎片)。重新分配之后,就会有一部分内存redis无法正常回收,一直占用着。
Redis4版本之后开始支持内存碎片的清理,默认情况下自动清理碎片的参数是关闭的:config get activedefrag
应该得到no的输出,开启:config set activedefrag yes
,再次输入config get activedefrag
验证输出是否为yes。
开启后,后台会启动进程,也可以手动清理:memory purge
查看:memory malloc-stats
注:此命令自版本可用。
TODO:输出解读。。
相关参数配置说明
# 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
Redis 3.2.9 (整个3版本?)的默认分配器
即libc
Redis 4.0 自动内存碎片整理(Active Defrag)源码分析
Inside of Jemalloc
Redis性能问题排查解决手册(七)
https://www.cnblogs.com/gjc592/p/12180024.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。