首页 > 数据库 >28.redis的内存碎片

28.redis的内存碎片

时间:2024-04-24 16:15:10浏览次数:31  
标签:redis Redis 清理 28 碎片 内存 memory

1.为什么会有 Redis 内存碎片?

  Redis 内存碎片产生比较常见的 2 个原因:

  1.1 Redis 存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间

  以下是这段 Redis 官方的原话:

To store user keys, Redis allocates at most as much memory as the maxmemory setting enables (however there are small extra allocations possible).

  Redis 使用 zmalloc 方法(Redis 自己实现的内存分配方法)进行内存分配的时候,除了要分配 size 大小的内存之外,还会多分配 PREFIX_SIZE 大小的内存。

 

  另外,Redis 可以使用多种内存分配器来分配内存( libc、jemalloc、tcmalloc),默认使用 jemalloc[1],而 jemalloc 按照一系列固定的大小(8 字节、16 字节、32 字节……)来分配内存的。jemalloc 划分的内存单元如下图所示:

       1.2、频繁修改 Redis 中的数据也会产生内存碎片。

       当 Redis 中的某个数据删除时,Redis 通常不会轻易释放内存给操作系统。

  文档地址:https://redis.io/topics/memory-optimization 

 

2.如何查看Redis的内存碎片

  使用 info memory 命令即可查看 Redis 内存相关的信息。下图中每个参数具体的含义,Redis 官方文档有详细的介绍:https://redis.io/commands/INFO 。 

 

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 内存碎片率太低该怎么办?- 爱可生开源社区 。

 

3.如何清理 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-cli  --big-keys命令扫出扫出大keys,且该命令可以降低redis的内存使用率

查考:得物面试:Redis 内存碎片是什么?如何清理? (qq.com)

 

 

标签:redis,Redis,清理,28,碎片,内存,memory
From: https://www.cnblogs.com/zmc60/p/18155680

相关文章

  • 【Redis】Redis的操作命令(二)——Redis 哈希(HASH)
    Redishash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。当设置一个名为demo的哈希对象时:HSETdemoname"redistutorial"description"redisbasiccommandsforcaching"likes20visitors23000 获取哈希对象语句,如下:HGETALLde......
  • P2839 [国家集训队] middle
    Sol:首先注意到答案是具有单调性的,考虑二分答案\(x\)解决。令$up(l,r,x)/down(l,r,x)$是\([l,r]\)中大于等于/小于\(x\)的数。那么对于一个区间\([l,r]\),显然中位数\(\gex\)的条件为\(up(l,r,x)\gedown(l,r,x)\).变形得到\(up(l,r,x)-down(l,r,......
  • docker-desktop使用redis镜像问题
    在学习docker的过程中尝试安装redis提供服务给本地开发环境,由于在windows环境下开发所以使用docker-desktop+wsl模式下运行,具体安装过程这里不展示。1.挂载配置文件与存储目录  刚开始的时候想挂载在docker运行的宿主wsl子系统中,docker-desktop运行时会启动docker-desktop与do......
  • windows下redis设置redis开机自启动
    windows系统下启动redis命令进入redis安装目录cdredis输入redis-server.exeredis.windows.conf启动redis命令,看是否成功可能会启动失败,报[1696]30Jan09:46:07.518#CreatingServerTCPlisteningsocket127.0.0.1:6379:bind:Noerror 报错后:输入redis-cli.exe......
  • Redis--单线程
    redis是单线程的吗?不是,redis的单线程指的是命令的执行是单线程的,如接收客户端请求->解析请求->进行数据读写等操作->发送数据给客户端这个过程是由一个线程(主线程)完成的。而redis程序并不是单线程,redis在启动的时候,会启动后台线程(BIO):Redis在2.6版本,会启动2个后台线程,分......
  • Spark设置executor-memory后,executor显示的内存不符问题
    以该命令为例,我们设置一个executor并分配内存为2800m,可以看到ui上只给executor分配了1.5G的内存。同理,如果你设置了--executor-memory=1g,那么实际上只会有1048.8M的内存会被分配。spark-submit--masteryarn\--num-executors=1\--executor-memory=2800m\--classorg.apac......
  • Redis(1)_Redis的基本认识
    初识Redis特征键值(key-value)型,value支持多种不同数据结构,功能丰富单线程,每个命令具备原子性低延迟,速度快(基于内存、IO多路复用、良好的编码)支持数据持久化支持主从集群、分片集群支持多语言客户端Redis命令数据结构Redis为了方便学习,将操作不同数据类型的命令做了分......
  • 【Redis】Redis的操作命令(二)——Redis 字符串(String)
    常见的Redis字符串命令如下:命令说明例子SETkeyvalue设置指定key的值 GETkey获取指定key的值 GETRANGEkeystartend返回key中字符串值的子字符 GETRANGEmykey03 GETSETkeyvalue将给定key的值设为value,并返回key的旧值(oldvalu......
  • 解决Mac电脑卡顿-内存不足问题
    解决Mac电脑卡顿-内存不足问题原理说明不管是风扇狂转还是键盘烫手,要解决这个问题,首先我们要明白为什么会出现这个问题?空间:通过下图大家可以明显对比出台式机和笔记本内部空间的差异,笔记本的体积决定了其内部空间相对紧凑,散热明显不如台式机;原理:电脑开始运行时,主要计算部件C......
  • IDEA 加大运行内存
    IDEA中,有时会出现运行卡顿的情况,大概率是内存不足导致的,可以通过如下步骤加大运行内存:自定义虚拟机内存。根据电脑内存大小设置,16G内存推荐设置为4G。重启IDEA,使新配置生效。显示内存占用。底部单击鼠标右键,勾选该项。双击可优化内存占用。......