傻大方


首页 > 人文 >

操作系统|百万架构谈Java:Redis内存碎片



按关键词阅读:

操作系统|百万架构谈Java:Redis内存碎片

文章图片

操作系统|百万架构谈Java:Redis内存碎片

文章图片


目录

  • 一、什么是内存碎片
  • 二、如何判断有内存碎片
  • 三、内存碎片是怎么形成的3.1 jemalloc分配机制导致3.2 数据的修改删除操作导致
  • 四、如何清理内存碎片4.1 重启4.2 redis内存碎片自动清理机制
  • 五、和现实的类比
一、什么是内存碎片redis数据删除后 , 所占用内存不会马上还给操作系统 , 而是交给内存分配管理器 , 所以对操作系统来说redis仍然占用着这些内存 。
这里有个风险点是:redis释放的内存有可能是不连续的 , 这种不连续的内存很可能无法再次使用 , 最终造成了内存的浪费 , 这种空闲但是无法使用的内存便是内存碎片 。
接下来主要介绍redis的内存碎片情况 , 产生原因以及最终的应对方案 。
二、如何判断有内存碎片可以通过redis提供的命令来查看redis的内存使用情况:
./redis-cli info memory

执行结果
# Memoryused_memory:5930032used_memory_human:5.66Mused_memory_rss:8359936used_memory_rss_human:7.97M...mem_fragmentation_ratio:1.32

used_memory是redis数据所占的内存大小 。 used_memory_rss是操作系统分配给redis的所有内存(包含没有使用的碎片) 。
mem_fragmentation_ratio= used_memory_rss / used_memory

mem_fragmentation_ratio:
  1. 大于1但是小于1.5:是相对合理的 , 碎片化可以接受 , 可以不进行碎片整理 。 下一节的碎片形成的原因可以看出 , 碎片本身是无法彻底避免的 。
  2. 大于1.5:碎片化严重 , 超过了50% 。 这种情况下需要想办法对碎片进行整理 , 降低碎片化绿
  3. 小于1.0:redis数据所占内存小于操作系统所分配的内存 , 这不能说没有碎片 , 这个时候说明redis的内存发送了swap , 有一部分数据被交换到了硬盘 , 会严重影响redis的性能 , 需要马上解决的 , 具体见操作系统swap对redis的影响 。
三、内存碎片是怎么形成的3.1 jemalloc分配机制导致jemallco是redis的默认内存分配器 , 其分配策略不是完全按照操作系统的按需分配来进行的 , 而是按照2^n次方的方式来分配 , 比如8字节 , 16字节 , 32字节、2KB , 4KB , 8KB等 , 固定大小 。
当redis申请内存时候 , jemalloc会分配一个大于所需内存但是最接近2^n的大小 , 比如需要20字节 , jemallo会分配32字节 。 这样天然就有12个字节的碎片存在 , 且无法避免 。
jemalloc这种分配方式的好处是减少内存分配的次数 , 上面的例子中需要20字节 , 但是分配了32 , 如果后期再需要10字节 , 则不再需要二次分配内存 。
3.2 数据的修改删除操作导致redis每个键值的大小都不一致 , 当有内存释放后有可能太小最终无法被马上使用 。

上图中假定A、B、C三块内存都为4KB , A被释放后会有总共有3*4=12KB的内存可用 。 但是由于A、B、C不连续 , 如果这个时候有一个10KB的数据需要分配内存 , 以上内存是无法使用的 , 这就是内存的浪费 。
大量的内存碎片会导致内存被浪费 , 这就需要对内存的碎片进行清理 。
四、如何清理内存碎片4.1 重启重启是最简单的办法 , 但是重启后如果没有开启rdb或者aof , 数据会彻底丢失 。
如果开启了持久化机制 , 恢复需要一定的时间 , 恢复期间redis本身又不可用 。
所以重启不是第一选择 , 比较优雅的办法是采用redis自身的碎片清理机制 。
4.2 redis内存碎片自动清理机制4.0版本后redis提供了自动内存碎片清理机制 。 核心思想就是对内存进行搬家合并 , 让空闲的内存合并到一起 , 形成大块可以使用的连续空间 。 继续上面的例子 。

可以看到通过碎片整理的内存能够存储10KB的数据 。
开启碎片自动清理
默认是关闭的 。
CONFIG SET activedefrag yes

redis自己的配置说明

特别需要注意的是redis的自动内存碎片清理是由主线程执行的 , 执行期间无法处理客户端请求 , 这会阻塞redis , 影响redis的性能 , 所以不能频繁的执行碎片清理 。
redis也提供了一些参数用于控制碎片执行的时机和条件 。

redis的上述配置文件也说明了 , 如非真的有必要 , 不要开启碎片清理 。
五、和现实的类比
买火车票 , 比如一班火车只有四个座位 , 分别在两排 。 每一排都连着 。分页标题#e#
这个时候卖出两张票 , 被两个人买了 , 分别是第一排的一个座位和第二排的一个座位 , 剩余两个座位 。
这时候有人想买两张连在一排的座位 , 就买不到了 , 虽然还有两个座位 , 这就是碎片 , 是浪费 。
【操作系统|百万架构谈Java:Redis内存碎片】平时坐火车我们有时候为了坐一起 , 会找协调其他旅客换座位 , 这就类似于碎片整理 。


    来源:(Java正道的光)

    【】网址:/a/2021/0202/kd669346.html

    标题:操作系统|百万架构谈Java:Redis内存碎片


    上一篇:支付宝|2021扫福全攻略,你懂得。

    下一篇:新浪财经|南华期货晨会:锌炼厂生产进入亏损状态 中长线可逐步布局多单


    人文

    偷盗者|美国警方发布协查通告:指认数百超市抢劫者

    阅读(49)

    【偷盗者|美国警方发布协查通告:指认数百超市抢劫者】 美媒6月12日报道 , 美国佛州警方发布一段超市被抢劫视频 , 望民众提供线索指认偷盗者 。 5月30日晚 , 当地一超市遭到抢劫 , 200多人抢走了超过10万美元的商品 。...

    人文

    新华网|美拼凑“反华十字军”注定徒劳一场

    阅读(14)

    各国忙于抗击疫情、拯救经济之际,美国国务卿蓬佩奥近日却忙着煽动仇恨、制造对抗。这位“反华急先锋”先是前往英国丹麦,游说盟友共同对抗中国,紧接着连线印度,怂恿其供应链去中国化,回到美国又接着发表演讲,恶毒诋毁中国共产党,总之四处渲染中国威胁,...

    人文

    分洪|江西河湖局局长:鄱阳湖区单退圩堤近22年首次全面开闸分洪

    阅读(38)

    鄱阳湖区185座单退圩堤首次全部开闸清堰分蓄洪水江西省河道湖泊管理局负责指导全省堤防运行管理。陈云翔介绍说,1998年特大洪水后,为了提高江河行洪能力,增大鄱阳湖水面和蓄洪量,江西省启动实施平垸行洪、退田还湖工程措施,涉及南昌、九江、上饶三个设区...

    人文

    冯唐|冯唐:成大事者,必须经历的3个段位

    阅读(22)

    口述:冯唐战略专家、知名作家编辑:三三供稿:蜻蜓FM《冯唐成事心法》来源:正和岛(ID:zhenghedao)01、主场作战曾国藩曾说:“故善用兵者,最喜为主,不喜为客”。就是说善于打仗的人,都喜欢在自己的地盘,自己做主打赢仗,不喜欢客场作战。战场就是商场...