美文网首页
记一次Redis的内存碎片比过高的解决

记一次Redis的内存碎片比过高的解决

作者: JensenWong | 来源:发表于2018-05-14 17:14 被阅读0次

内存碎片率

Redis的一个很重要的性能指标——mem_fragmentation_ratio(内存碎片率)
mem_fragmentation_ratio是通过以下的公式计算出来的


计算公式

可以直接以下命令查看得到

# redis-cli -h localhost -p 6379 info
used_memory:1949752
used_memory_human:1.86M
used_memory_rss:9281536
used_memory_peak:1994224
used_memory_peak_human:1.90M
mem_fragmentation_ratio:4.76

可以看到内存碎片率已经达到了4.76,内存碎片率略高于1是属于正常,但超出1.5的时候就说明redis的内存管理变差了

原因

分析实际环境,因为该redis主要是存储频繁更新的数据,每次更新数据之前,redis会删除旧的数据,实际上,由于Redis释放了内存块,但内存分配器并没有返回内存给操作系统,这个内存分配器是在编译时指定的,可以是libc、jemalloc或者tcmalloc。used_memory_rss会越来越大,导致mem_fragmentation_ratio越来越高

解决方法

  1. 重启Redis服务器可以让额外产生的内存碎片失效并重新作为新内存来使用,使操作系统恢复高效的内存管理
  2. 修改内存分配器。Redis支持glibc’s malloc、jemalloc11、tcmalloc几种不同的内存分配器,每个分配器在内存分配和碎片上都有不同的实现。不建议普通管理员修改Redis默认内存分配器,因为这需要完全理解这几种内存分配器的差异,也要重新编译Redis

相关文章

网友评论

      本文标题:记一次Redis的内存碎片比过高的解决

      本文链接:https://www.haomeiwen.com/subject/wyoddftx.html