Redis内存碎片

摘要:
接下来,我们主要介绍Redis的内存碎片、原因和最终解决方案。如果启用了持久性机制,恢复将需要一段时间,并且在恢复期间Redis本身将不可用。因此,重启不是第一选择。更优雅的方法是使用Redis自己的碎片清理机制。Redis还提供了一些参数来控制片段执行的时间和条件。
目录
一、什么是内存碎片

redis数据删除后,所占用内存不会马上还给操作系统,而是交给内存分配管理器,所以对操作系统来说redis仍然占用着这些内存。

这里有个风险点是:redis释放的内存有可能是不连续的,这种不连续的内存很可能无法再次使用,最终造成了内存的浪费,这种空闲但是无法使用的内存便是内存碎片。

接下来主要介绍redis的内存碎片情况,产生原因以及最终的应对方案。

二、如何判断有内存碎片

可以通过redis提供的命令来查看redis的内存使用情况:

 ./redis-cli info memory

执行结果

# Memory
used_memory:5930032
used_memory_human:5.66M
used_memory_rss:8359936
used_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每个键值的大小都不一致,当有内存释放后有可能太小最终无法被马上使用。

Redis内存碎片第1张

上图中假定A、B、C三块内存都为4KB,A被释放后会有总共有3*4=12KB的内存可用。但是由于A、B、C不连续,如果这个时候有一个10KB的数据需要分配内存,以上内存是无法使用的,这就是内存的浪费。

大量的内存碎片会导致内存被浪费,这就需要对内存的碎片进行清理。

四、如何清理内存碎片

4.1 重启

重启是最简单的办法,但是重启后如果没有开启rdb或者aof,数据会彻底丢失。

如果开启了持久化机制,恢复需要一定的时间,恢复期间redis本身又不可用。

所以重启不是第一选择,比较优雅的办法是采用redis自身的碎片清理机制。

4.2 redis内存碎片自动清理机制

4.0版本后redis提供了自动内存碎片清理机制。核心思想就是对内存进行搬家合并,让空闲的内存合并到一起,形成大块可以使用的连续空间。继续上面的例子。

Redis内存碎片第2张

可以看到通过碎片整理的内存能够存储10KB的数据。

开启碎片自动清理

默认是关闭的。

CONFIG SET activedefrag yes

redis自己的配置说明

Redis内存碎片第3张

特别需要注意的是redis的自动内存碎片清理是由主线程执行的,执行期间无法处理客户端请求,这会阻塞redis,影响redis的性能,所以不能频繁的执行碎片清理。

redis也提供了一些参数用于控制碎片执行的时机和条件。

# The configuration parameters are able to fine tune the behavior of the
# defragmentation process. If you are not sure about what they mean it is
# a good idea to leave the defaults untouched.

# Enabled active defragmentation
# activedefrag no

# 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, to be used when the lower
# threshold is reached
# active-defrag-cycle-min 1

# Maximal effort for defrag in CPU percentage, to be used when the upper
# threshold is reached
# active-defrag-cycle-max 25

# Maximum number of set/hash/zset/list fields that will be processed from
# the main dictionary scan
# active-defrag-max-scan-fields 1000

redis的上述配置文件也说明了,如非真的有必要,不要开启碎片清理。

五、和现实的类比

买火车票,比如一班火车只有四个座位,分别在两排。每一排都连着。

这个时候卖出两张票,被两个人买了,分别是第一排的一个座位和第二排的一个座位,剩余两个座位。

这时候有人想买两张连在一排的座位,就买不到了,虽然还有两个座位,这就是碎片,是浪费。

平时坐火车我们有时候为了坐一起,会找协调其他旅客换座位,这就类似于碎片整理。

免责声明:文章转载自《Redis内存碎片》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cPanel 和 WHM 软件中存在双因素身份验证绕过漏洞Manjaro 使用基础下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos安装redis并开启多个redis实例

1.下载安装包       下载地址 :  http://download.redis.io/releases/,去里面找对应的版本下载        例如  wget http://download.redis.io/releases/redis-5.0.0.tar.gz 2.解压       tar -zxf  redis-5.0.0.tar.gz  ...

Net分布式系统之五:C#使用Redis集群缓存

本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层。 一、背景 系统考虑到高并发的使用场景。对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决。对于系统高并发查询,为了提供性能减少数据库压力,我们加入缓存机制,可以不同层次加入缓存支持,本文主要介绍应用服务层和数据层之间加入缓存机制提升性能。业界缓存组件有Redis、Memcached...

redis忘记密码的情况下重置密码

1、进入配置文件  2、找到“requirepass”,后面为你的密码。  3、搜索-服务,进入系统服务,停止Redis服务。  4、打开cmd窗口,卸载redis服务并重新安装。 卸载redis服务: redis-service.exe --service-install redis.windows.conf 安装redis服务: redis-se...

使用redis作为消息队列的用法

背景 最近项目有个需求需要动态更新规则,当时脑中想到的第一个方案是利用zk的监听机制,管理人员更新完规则将状态写入zk,集群中的机器监听zk的状态,当有状态变更后,集群中的机器开始拉取最新的配置。但由于公司技术选型,没有专门搭建zk集群,因此也不可能为这一个小需求去搭建zk集群。图为使用zk监听状态变化的流程。 最后只好退而求其次,想到了使用redis的...

Redis Cluster 部署

内容: Redis 编译安装 Redis Cluster部署 Redis 集群扩容 Redis 指定机器下线  环境: 主机名 IP node1 192.168.10.1 node2 192.168.10.2 node3 192.168.10.3 node4 192.168.10.4 node5 192.168.10.5 node6 192....

3--Redis事务 ;配置文件详解 ;数据持久化

目录 一、事务 1.Redis的事务 2. 监控watch 二、Redis.conf详解 1.配置文件unit单位对大小写不敏感 2.包含 3.网络 4.通用general 5.快照 6.SECURITY安全 7.限制clients 8.append only 模式 aof配置 三、数据持久化 1.Redis数据安全问题 2.快照持久化...