什么是内存碎片

你可以将内存碎片简单地理解为那些不可用的空闲内存。

举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。

Redis 内存碎片虽然不会影响 Redis 性能,但是会增加内存消耗。

为什么会有 Redis 内存碎片

Redis 内存碎片产生比较常见的 2 个原因:
Redis 存储存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间。
频繁修改 Redis 中的数据也会产生内存碎片。

如何查看 Redis 内存碎片的信息

使用 info memory 命令即可查看 Redis 内存相关的信息。

Redis 内存碎片率的计算公式:mem_fragmentation_ratio (内存碎片率)= used_memory_rss (操作系统实际分配给 Redis 的物理内存空间大小)/ used_memory(Redis 内存分配器为了存储数据实际申请使用的内存空间大小)

也就是说,mem_fragmentation_ratio (内存碎片率)的值越大代表内存碎片率越严重。

一定不要误认为used_memory_rss 减去 used_memory值就是内存碎片的大小!!!这不仅包括内存碎片,还包括其他进程开销,以及共享库、堆栈等的开销。

很多小伙伴可能要问了:“多大的内存碎片率才是需要清理呢?”。

通常情况下,我们认为 mem_fragmentation_ratio > 1.5 的话才需要清理内存碎片。 mem_fragmentation_ratio > 1.5 意味着你使用 Redis 存储实际大小 2G 的数据需要使用大于 3G 的内存。

如果想要快速查看内存碎片率的话,你还可以通过下面这个命令:

redis-cli -p 6379 info | grep mem_fragmentation_ratio
另外,内存碎片率可能存在小于 1 的情况。这种情况我在日常使用中还没有遇到过,感兴趣的小伙伴可以看看这篇文章 故障分析 | Redis 内存碎片率太低该怎么办?

如何清理 Redis 内存碎片

Redis4.0-RC3 版本以后自带了内存整理,可以避免内存碎片率过大的问题。
直接通过 config set 命令将 activedefrag 配置项设置为 yes 即可。
config set activedefrag yes
具体什么时候清理需要通过下面两个参数控制:


内存碎片占用空间达到 500mb 的时候开始清理
config set active-defrag-ignore-bytes 500mb


内存碎片率大于 1.5 的时候开始清理
config set active-defrag-threshold-lower 50


通过 Redis 自动内存碎片清理机制可能会对 Redis 的性能产生影响,我们可以通过下面两个参数来减少对 Redis 性能的影响:

内存碎片清理所占用 CPU 时间的比例不低于 20%
config set active-defrag-cycle-min 20

内存碎片清理所占用 CPU 时间的比例不高于 50%
config set active-defrag-cycle-max 50

另外,重启节点可以做到内存碎片重新整理。如果你采用的是高可用架构的 Redis 集群的话,你可以将碎片率过高的主节点转换为从节点,以便进行安全重启。

redis内存碎片问题相关推荐

  1. Redis 内存碎片详解

    什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存. 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内 ...

  2. 6、Redis内存碎片优化

    1.Redis内存碎片是如何形成的 一是内存分配器的分配策略,内存分配器一般是按固定大小来分配内存,而不是按实际使用大小来分配.例如8字节.16字节.32字节...,2KB,4KB,8KB等,按程序申 ...

  3. 什么是Redis内存碎片率?碎片如何清理?

    Redis服务器内存不够用了,这时可以看看是否是内存碎片的原因,不一定只能靠内存扩容来处理. 一.碎片率的计算 我们登陆到Redis服务器上,执行以下命令: info memory 我们会看到如下的信 ...

  4. 深入分析Redis内存碎片

    前言 我们先来看一个问题, 假设Redis实例保存了5GB的数据,现在删除了2GB的数据,那么Redis进程占用的内存会不会减少呢? 答案是:它可能仍然占用大约5GB内存,即使Redis数据只占用大约 ...

  5. Redis 性能优化 —— 内存碎片

    文章目录 一.内存碎片场景描述 二.内存碎片概念解析 三.内存碎片产生原因 四.内存碎片如何判断 五.内存碎片解决方案 六.内存碎片扩展技能 一.内存碎片场景描述 作为内存数据库,内存空间的大小对于 ...

  6. 一文深入了解 Redis 内存模型,Redis 的快是有原因的!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:编程迷思 cnblogs.com/kismetv/p/865 ...

  7. Redis为什么这么快?一文深入了解Redis内存模型!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 " Redis 是目前最火爆的内存数据库之一,通过在内存 ...

  8. 面试不怂之redis与缓存大全

    基础篇 问题:什么是redis? Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源.包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,其具备 ...

  9. 细说Redis监控和告警

    https://blog.csdn.net/qq_27623337/article/details/53206685 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其redis这类敏感的纯 ...

  10. Redis常用操作和内存模型

    几个常用命令行 登录 redis-cli-h127.0.0.1-p6379-a123 查看内存 info memory 这里面 info 是命令 memory 是参数 单单输入 info 就死查看所有 ...

最新文章

  1. 甲小姐对话稚晖君:深度学习并非AI的终点
  2. 病毒周报(081110至081116)
  3. 【Laravel】连接 sqlite 数据库 Database [xxx] not exist
  4. 巨蟒python全栈开发flask11项目开始3
  5. 台阶问题---动态规划算法
  6. LeetCode meituan-001. 小美的用户名
  7. MYSQL数据库安装记
  8. DokuWiki的发现之旅
  9. raster | R语言中的空间栅格对象及其基本处理方法(Ⅳ):数据聚合、重采样
  10. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
  11. 阿里Java开发规约笔记
  12. SQL SERVER 2012 只能识别20个CPU的问题
  13. Verilog测试:TestBench结构
  14. 剖析人生赚钱五大境界颠覆你的认知
  15. PackageManager的参数及使用
  16. hive 常用函数操作
  17. 用友java开发待遇_【北京用友软件工资】java开发工程师待遇-看准网
  18. 在使用git bash输入命令时,已输入命令按Backspace键无法删除
  19. 凯思面试经历转置一个string
  20. Fairy Tail - Main Theme Slow Version guitar (solo)

热门文章

  1. 化工企业ERP建设中设备管理的重要性
  2. 解决“安装程序无法创建新的系统分区,也无法定位现有系统分区”问题方法
  3. Linux入门及进阶学习推荐书籍
  4. 这五款办公神器一个比一个好用
  5. java retainall_java 取交集方法retainAll
  6. 高通QCA9531方案定制开发主板300M 2.4G无线模块面板AP wifi路由模块 用的是什么网络变压器
  7. 数学建模之数据包络分析(评价投入产出比的模型)
  8. es6阮一峰-import、export学习
  9. python 机器翻译免费接口调用
  10. capslock键英语怎么读_电脑键盘上的那些英文键怎么读?