目录
2.1:我们通过命令行 INFO MEMORY查看redis中内存使用情况
2.2:通过MEMORY MALLOC-STATS 再次验证
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是占用的内存数)

如上图所示,即时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中内存碎片清理主要分为以下两个阶段
- 在redis4.0之前的版本中只能通过正确的重启redis服务来解决内存碎片问题。
- 在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中处理内存碎片的命令和策略。通过INFO MEMORY和MEMORY MALLOC-STATS命令观察内存使用情况,当内存碎片率高时,可以使用MEMORY PURGE手动清理或设置activedefrag自动清理。手动清理会阻塞主进程,自动清理为实验性功能,需谨慎使用。

186

被折叠的 条评论
为什么被折叠?



