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

内存碎片率

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性能问题排查解决手册(七) 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令...
    meng_philip123阅读 4,271评论 0 30
  • 文章转摘自:http://www.cnblogs.com/mushroom/p/4738170.html 性能相关...
    奋斗live阅读 7,028评论 2 10
  • 参考来源 Redis的内存优化 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直...
    秦汉邮侠阅读 1,308评论 0 2
  • Redis的内存优化 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。 Redis所有的数据都...
    meng_philip123阅读 18,938评论 2 29
  • 断断续续,《用户故事与敏捷方法》全部读完了,整体感受是: 1.这本书作为入门非常合适。 2.书中涉及到敏捷工作方法...
    风雪01阅读 324评论 0 0