关于Redis的内存占用率 | 青训营笔记

306 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

我在开发青训营的项目时租了一个服务器,并在服务器上辅助开发,在使用一段时间后发现,明明启动的进程很少,但是内存占用率却比较高。

image.png

我想到由于Redis是在内存中的,所以一定是Redis占用的内存比较高,可是我并没有存很多数据,为什么会有这么高的内存占用率呢。在经过百度后我发现,原来是因为,当数据删除后,Redis释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给Redis分配了大量内存。

并且Redis释放的内存空间可能并不是连续的,当这些不连续的内存空间处于一种闲置的状态就产生了内存碎片。

内存利用率的高低直接影响Redis运行效率的高低。为了让用户能监控到实时的内存使用情况,Redis自身提供了 INFO 命令,可以用来查询内存使用的详细信息。

image.png
这里省略了一些信息,在这些指标中,有一项叫做mem_fragmentation_ratio,它是操作系统实际分配给Redis的物理内存空间与Redis实际申请使用的空间的比值,一般比较合理的值是1~1.5,如果大于1.5,说明碎片率超过了50%,看看我服务器中的这个指标,居然高达11+,怪不得我并没怎么使用,内存占用率就这么高。
image.png

那么如何清理内存碎片?

  1. 直接重启,毕竟大多数问题都可以通过重启解决(doge)。但如果Redis中的数据没有持久化,那么数据就会丢失;即使Redis数据持久化了,我们还需要通过AOF或RDB进行恢复,如果只有一个Redis实例,恢复阶段无法提供服务。

  2. 启用自动内存碎片清理,可以把activedefrag配置项设置为yes,命令如下:

config set activedefrag yes

触发条件为:
active-defrag-ignore-bytes 100mb即内存碎片的字节数达到100MB;
active-defrag-threshold-lower 10即内存碎片空间占操作系统分配给Redis的总空间比例达到10%;