前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 内存碎片率太低该怎么办?

Redis 内存碎片率太低该怎么办?

作者头像
似水流年o
修改2022-09-30 15:01:21
8970
修改2022-09-30 15:01:21
举报
文章被收录于专栏:编程学习收获

背景问题

偶然收到某客户问题“我的 Redis 内存碎片率很低在 0.2 左右,网上说会导致 Redis 性能变慢,我该咋办?”。

官方的计算 Redis 内存碎片率的公式如下:

代码语言:javascript
复制
mem_fragmentation_ratio = used_memory_rss/used_memory

即 Redis 向操作系统中申请的内存分配器分配的内存总量 的比值,两者简单来讲:

  • 前者是我们通过 top 命令看到的 redis 进程 RES 内存占用总量
  • 后者由 Redis 内存分配器(如 jemalloc)分配,包括自身内存、缓冲区、数据对象等

两者的比值结果 < 1 表示碎片率低, > 1 为高, 碎片率高的问题百度上海量文章有介绍,不多赘述,但碎片率低基本都归咎于使用了 SWAP 而导致 Redis 因访问磁盘而性能变慢。但,真的是这样吗?

验证

客户生产环境中

  • 禁用了 SWAP
  • 数据量为 60M 左右
  • repl-backlog-size 即复制积压缓冲区配置为 512M

所以我这边设置下 vm.swappiness = 1 将 swap 先关掉,设置 repl-backlog-size=512M,再启个 Redis 空实例。

图1
图1

看下 memory stats ,由于没任何键、复制线程、客户端,所以数据对象占用内存、复制积压缓冲区、客户端相关 buffer 都为 0;此时 Redis 内存分配器分配的内存总量是 863944(启动后初始内存量 startup.allocated+ 初始元数据 dataset.bytes),向操作系统申请的内存为 2789376,碎片率为 3.48。

图2
图2

给测试库启动个从库后,碎片率瞬间降为 0.01;

图3
图3

看下实例配置,实际复制积压缓冲区大小与分配器内存分配值能对应上,都为 512M;所以启动复制后,因为分配总内存变大但向操作系统申请的内存无太大变化,所以碎片率取值自然会骤降。

图4
图4

为什么此时 Redis 不向操作系统申请配置指定的 512M 内存?

答案是:只有在 slave 端初次建立复制/失连时才会真正向操作系统申请复制积压缓存;并且不是一次性向 OS 申请 512M,而是按需使用;可以简单测试如下。

模拟从库失联

从库执行 debug 命令模拟 Redis 夯死,

图5
图5

给主库制造点压力,

图6
图6

通过指定命令输出内存使用情况如下。

图7
图7

能看到复制积压缓冲区、复制客户端输出缓冲区逐渐消耗内存,但操作系统实际内存 used_memory_rss 并非一次性打满,而是按需增加

碎片率小于 1 跟数据量有无关系?

前面通过实验,可以知道碎片率低并非仅由 SWAP 导致,复制积压缓冲区等配置值过大、键值对象数据极小的情况下也会使比值降低;那么数据量变大会咋样?

持续灌入数据,

图8
图8

可以看到 used_memroyused_memory_rss 都会逐渐变大,内存碎片率取值将逐渐趋于 1。

图9
图9

结论

  • Redis 内存碎片率低并非只跟 SWAP 有关,生产环境通常建议禁用了 SWAP。
  • 复制积压缓冲区配置较大、业务数据量较小的情况下极容易造成碎片率 远低于 1这是正常现象,无需优化或调整。
  • 通常将线上环境复制缓冲区的值 repl-backlog-size 设置的比较大,目的是防止主库频繁出现全量复制而影响性能。
  • 随着业务数据量增长,Redis 内存碎片率比值会逐渐趋于 1。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景问题
  • 验证
  • 模拟从库失联
  • 碎片率小于 1 跟数据量有无关系?
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档