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