redis中内存碎片处理

目录

序言:

1:Redis中提供了哪些关于内存有关的命令(4.0之后)

1.1:MEMOEY DOCTOR

1.2:MEMOEY MALLOC-STATS

1.3:MEMOEY PURGE

1.4:MEMOEY STATS

1.5:MEMOEY USAGE

1.6:MEMOEY HELP

2:什么时候需要进行内存清理

2.1:我们通过命令行 INFO MEMORY查看redis中内存使用情况

2.2:通过MEMORY MALLOC-STATS 再次验证

3:内存碎片清理

3.1:MEMORY PURGE (手动命令处理)

2.2:通过配置(配置文件中设置activedefrag yes),系统自动处理


序言:

内存碎片是redis服务中分配器分配存储对象内存的时产生的。随着服务的运行,内存碎片也会随之越来越多,如果不进行处理导致内存资源的浪费。如果在内存资源紧张的服务器中出现大量内存碎片会导致OOM溢出与swap交换。

1:Redis中提供了哪些关于内存有关的命令(4.0之后)

1.1:MEMOEY DOCTOR

 会列出 Redis 服务器遇到的不同类型的内存相关问题,并提供相应的解决建议

1.2:MEMOEY MALLOC-STATS

MEMORY MALLOC-STATS 命令提供内存分配情况的内部统计报表,(目前只支持jemalloc内存分配器)。通过该命令可以看出jemalloc对于所有对象进行分配时,各具体分区的内存详细状况。

1.3:MEMOEY PURGE

支持该命令会清除内存碎片

1.4:MEMOEY STATS

将服务器的内存使用情况以数组情况返回

1.5:MEMOEY USAGE

该命令给出一个key和它值在RAM中占用的字节数(包含redis管理该key是占用的内存数)

redis中内存碎片处理_第1张图片

如上图所示,即时key value为空,也占用了46b的内存资源。

1.6:MEMOEY HELP

提示上述5种命令的作用以及使用情况

2:什么时候需要进行内存清理

2.1:我们通过命令行 INFO MEMORY查看redis中内存使用情况

发现内存碎片率达到了536.29,说明服务中大多数内存的占用都是因为存在大量的内存碎片。

2.2:通过MEMORY MALLOC-STATS 再次验证

如下图所示:

 

我们关注的是util行,很多bins的使用率小于0.1,说明整体的内存使用率不高,存在大量的内存碎片

3:内存碎片清理

针对于上述demo情况进行对redis内存进行碎片清理,redis中内存碎片清理主要分为以下两个阶段

  1. 在redis4.0之前的版本中只能通过正确的重启redis服务来解决内存碎片问题。
  2. 在redis4.0之后,redis提供了两种方式的碎片整理功能,第一种通过手动命令进行触发,第二种通过配置(配置文件中设置activedefrag yes),使redis在运行时就可以自动的进行内存碎片清理。

3.1:MEMORY PURGE (手动命令处理)

redis提供MEMORY PURGE命令手动进行回收内存(此命令会阻塞主进程)

执行完成之后再次验证

发现内存碎片率从536.29急剧下降到12.36,通过MEMORY MALLOC-STATS中utils发现大量的bins达到了1。

2.2:通过配置(配置文件中设置activedefrag yes),系统自动处理

在使用自动垃圾整理服务之前,redis在配置文件中给予我们使用该功能的警告!目前该功能只是实验性质,如果需要使用该功能需要先进性压力测试以及功能评估(因为内存碎片整理是通过主线程程进行的,redis又是单线程的,内存碎片整理操作会 scan (通过迭代进行)整个 redis 节点,并进行内存复制、转移等操作。如果频繁的触发内存整理,肯定会导致redis服务整体响应时间变长。可以通过latency来进行对比)

#
# WARNING THIS FEATURE IS EXPERIMENTAL. However it was stress tested
# even in production and manually tested by multiple engineers for some
# time.

##警告此功能是实验性的。然而,即使在生产中也进行了压力测试,并且由多个工程师手动测试了一段时间。
##通过配置文件进行设置
# 开启自动清除垃圾碎片功能
activedefrag yes

# 启动碎片整理的最小内存碎片量默认100md
active-defrag-ignore-bytes 100mb

##此处内存碎片率与该值与mem_fragmentation_ratio的计算规则不一致
# 当内存碎片超过 10% 时,开启内存碎片整理
active-defrag-threshold-lower 10

#  内存碎片超过 100%,则尽最大努力整理
active-defrag-threshold-upper 100

# 内存碎片回收使用cpu资源最小比率 默认5
active-defrag-cycle-min 5

# 内存碎片回收使用使用cpu资源最大比率 默认75
active-defrag-cycle-max 75

#从主字典扫描中处理的SET/HASH/ZSET/List字段的最大数目 默认1000
active-defrag-max-scan-fields 1000

上述参数需要结合线上redis的环境进行压测得到最适用的值。

你可能感兴趣的:(redis)