Redis 中的内存碎片化是什么?如何进行优化?

Sherwin.Wei Lv7

Redis 中的内存碎片化是什么?如何进行优化?

回答重点

Redis 的内存碎片化是指内存使用中出现小块空间被闲置,无法被有效利用的现象。

Redis 默认使用 jemalloc 作为内存分配器,它是按照固定大小来分配内存的,比如实际需要 8kb 的内存,分配器给了 12kb。

那么多余的 4kb 其实就无法被利用上了,它就叫内存碎片。

且频繁创建和删除大量数据的时候,会导致内存块大小和位置不连续,内存碎片会变多。

可以通过 INFO memory 命令查看内存碎片率(mem_fragmentation_ratio):

1
2
3
4
5
6
# Memory
used_memory:1000000 ## 实际申请的内存空间
used_memory_human:977.54K
used_memory_rss:1200000 ##表示实际占用的物理内存空间(含内存碎片)
used_memory_rss_human:1.14M
mem_fragmentation_ratio:1.20
  • used_memory:Redis 实际使用的内存,单位是字节。
  • used_memory_rss:从操作系统的角度来看,Redis 占用的总内存量(含内存碎片),单位是字节。

mem_fragmentation_ratio = used_memory_rss / used_memory,所以大于 1 就代表有内存碎片。

如果值较大,就需要考虑内存碎片的清理了。

如果小于 1 问题也很大,说明 redis 已经使用了 swap 用上磁盘空间了,性能会变得很差。

扩展知识

如何解决内存碎片

1)最简单的解决方法是定期重启 Redis 服务,这样可以消除内存碎片并优化内存的布局,但是会导致服务不可用。
2)Redis 4.0 及以上版本引入了内存碎片整理功能。通过配置 activedefrag 选项,Redis 可以在运行时尝试整理内存碎片,将小的内存块合并为更大的块。

3)通过优化数据存储结构和类型。如:使用 ListPack 替代 ziplist。

4)利用 MEMORY PURGE 命令手动清理碎片,但是这个命令会阻塞主线程

Comments
On this page
Redis 中的内存碎片化是什么?如何进行优化?