Redis内存碎片自动回收

前言

今天说的是一个老问题了,关于 Redis 内存碎片的回收,以前用过几次,今天再次使用时发现自己没总结,没有可以拿来直接用的命令,花了一些时间去查找和测试,为了以后使用时更方便,我决定把整理一下放在这,等待再次相遇。

预制命令

  1. 查询内存情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@server ~]# redis-cli -a "password" info memory
# Memory
used_memory:48320108840
used_memory_human:45.00G
used_memory_rss:56677724160
used_memory_rss_human:52.79G
used_memory_peak:57105514920
used_memory_peak_human:53.18G
used_memory_peak_perc:84.62%
used_memory_overhead:71864532
used_memory_startup:786616
used_memory_dataset:48248244308
used_memory_dataset_perc:99.85%
total_system_memory:135025369088
total_system_memory_human:125.75G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.17
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
  1. 查询是否开启了自动清理碎片
1
2
3
[root@server ~]# redis-cli -a "password" config get activedefrag
1) "activedefrag"
2) "no"
  1. 开启碎片自动清理
1
2
[root@server ~]# redis-cli -a "password" config set activedefrag yes
OK
  1. 关闭碎片自动清理
1
2
[root@server ~]# redis-cli -a "password" config set activedefrag no
OK

聊聊背后的东西

上面已经把命令都烹饪好了,接下来可以聊聊背后的东西。

先学个单词 defrag /dɪˈfræɡ/,“整理磁盘碎片”的意思,后面的内容大部分都和这个单词有关。

Redis 的数据都存储在内存中,当我们的应用程序频繁修改 Redis 中的数据,特别是删除大量的Key时,就有可能会导致 Redis 产生内存碎片,或者是一些内存剩余,其实Redis删除Key之后使用的内存肯定少了,但是它不一定会释放出来,有时也算是一种预先分配的机制,就比如他的数据只有1个G,但是有可能申请1.2个G的空间,这样在添加新的key时,通常立马就可以使用,不必再去申请新的内存了。

过多的内存碎片会降低 Redis 的内存使用率,通过Redis 的 info memory 命令,查到内存使用率 mem_fragmentation_ratio:1.17,这个值的计算比较简单:

mem_fragmentation_ratio = used_memory_rss / used_memory

其中 used_memory 表示 Redis 存储数据的内存大小,used_memory_rss 表示操作系统实际分配给 Redis 进程的内存大小。

Redis 从 4.0 版本开始,提供了自动碎片整理的功能,可以通过配置开启碎片自动整理,也可以

如果你使用的是 Redis 4.0 以下版本,只能通过重启实例来解决
如果你使用的是 Redis 4.0 版本,它正好提供了自动碎片整理的功能,可以通过配置开启碎片自动整理,开启内存碎片整理必然会占用服务器的计算资源,这可能会导致 Redis 性能下降。所以是否开启这个功能,最好提前测试评估

究其原因,Redis 的碎片整理工作也是在主线程中执行的,当其进行碎片整理时,肯定会会消耗 CPU 计算资源,产生更多的耗时,从而可能影响到客户端的请求。

Redis 碎片整理的参数配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 开启自动内存碎片整理(总开关)
activedefrag no
# 内存使用 100MB 以下,不进行碎片整理
active-defrag-ignore-bytes 100mb
# 内存碎片率超过 10%,开始碎片整理
active-defrag-threshold-lower 10
# 内存碎片率超过 100%,尽最大努力碎片整理
active-defrag-threshold-upper 100
# 内存碎片整理占用 CPU 资源最小百分比
active-defrag-cycle-min 1
# 内存碎片整理占用 CPU 资源最大百分比
active-defrag-cycle-max 25

本机查询情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@server ~]# redis-cli -a "password" config get activedefrag
1) "activedefrag"
2) "yes"
[root@server ~]# redis-cli -a "password" config get active-defrag-ignore-bytes
1) "active-defrag-ignore-bytes"
2) "104857600"
[root@server ~]# redis-cli -a "password" config get active-defrag-threshold-lower
1) "active-defrag-threshold-lower"
2) "10"
[root@server ~]# redis-cli -a "password" config get active-defrag-cycle-min
1) "active-defrag-cycle-min"
2) "25"
[root@server ~]# redis-cli -a "password" config get active-defrag-cycle-max
1) "active-defrag-cycle-max"
2) "75"
[root@server ~]# redis-cli -a "password" config get active-defrag-max-scan-fields
(empty list or set)

总结

  • Redis 从 4.0 版本开始,提供了自动碎片整理的功能,可以通过配置开启碎片自动整理
  • 内存查询 info memory, 查询碎片整理是否开启 config get activedefrag
  • 开启碎片整理 config set activedefrag yes
  • 关闭碎片整理 config set activedefrag no

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

不畏浮云遮望眼,只缘身在最高层。真的是这样吗?如果你太高了浮云遮住了你向下望的眼睛呢?太低看不到高处,而太高又看不清地处了呀~

2024-10-24 20:15:17

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客