Redis调优之内存碎片

Admin 2019-03-28 14:38:27 Redis

介绍

内存碎片是redis在分配、回收物理内存过程中产生的。如:如果对数据的更改频繁,而且数据之间的大小相差很大,可能导致redis释放的空间在物理内存中并没有释放,但redis又无法有效利用,这就形成了内存碎片。内存碎片不会通知在use_memory中。

内存碎片的产生与对数据进行的操作、数据的特点都有关,此外与使用的内存分配器也有关系,如果内存分配器设计合理,可以尽可能的减少内存碎片的产生(默认使用jemalloc分配内存)。

如果redis服务器中的内存碎片已经很大,可以通过安全重启的方式减小内存碎片,因重启后,redis重新从备份文件中读取数据,在内存中进行重排,为每个数据重新选择合适的内存单元,减小内存碎片。

查看内存状态

./redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:2195664
used_memory_human:2.09M
used_memory_rss:9523200
used_memory_rss_human:9.08M
used_memory_peak:2410952
used_memory_peak_human:2.30M
total_system_memory:8252571648
total_system_memory_human:7.69G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.34
mem_allocator:jemalloc-4.0.3

use_memory:已使用的内存大小,包括redis进程内部开销和cache的数据占用,单位byte

use_memory_human:用户数据所占内存,缓存数据的大小

used_memory_rss:物理内存的大小,即向系统申请的内存

used_memory_peak:峰值时使用的内存

used_memory_peak_human:用户cache数据的峰值大小

used_memory_lua:执行lua脚本占用的内存

mem_fragmentation_ratio:内存碎片率,used_memory_rss / use_memory 1表明有内存碎片,值越大表明越多。

小于1表明正在使用虚拟内存(硬盘虚拟出的内存),性能比较低,应该增强机器的内存。一般情况,应该在1 ~ 1.5之间比较健康。

mem_allocator:redis使用的内存分配器,可以是libc、jemalloc、tcmalloc,默认是jemalloc,在64位系统中,将内存空间划分为小、大、巨大三个范围,每个范围内又划分许多小的内存块,存储数据的时候,会选择最合适的内存块。

x.png

产生原因

  1. redis自身的内存分配器

  2. 频繁更新,更新后的值比原来的值差异较大

  3. maxmemory限制导致key被回收删除

进程在需要内存时,首先会向系统申请, 然后才能使用。一般进程在不需要的时候会释放掉内存。但是redis为了更高的性能,在redis中实现了内存分配器来管理内存,不会马上释放,不用每次都向系统申请。

但是在内存分配器,没个k-v初始化的内存大小是最适合的,当这个值改变时并且和原来内存大小不适用的时候,就需要重新分配内存,重新分配后就会有一部分内存无法正常回收,形成内存碎片。

解决方法

  1. 限制内存交换

  2. 重启redis服务,简单粗暴

  3. redis4.0后可以使用新增指令手动回收内存碎片

相关文章
最新推荐