首页 > 数据库 >Redis 内存碎片原因及清理

Redis 内存碎片原因及清理

时间:2024-08-30 15:26:57浏览次数:13  
标签:清理 Redis defrag redis 碎片 内存 memory

一、Redis 内存碎片

内存碎片是指在内存分配的时候,产生的不能重复利用的空间。例如,内存空间还有3K,应用程序想申请连续的3K空间,虽然内存空间够,但是空间分配为2K,1K,总空间够,但是不连续,导致应用程序申请失败,这种无法利用的内存空间称之为"内存碎片"。内存分片会占用操作系统分配给redis的内存空间,严重影响redis性能。


二、内存碎片形成原因

1.内因
内存分片策略引发:redis默认使用jemalloc分配器分配内存。jemalloc每次分配2*N固定空间,例如写入数据申请10K空间,jemalloc会分配16K空间,优点:下次写入>=6K数据不需要申请内存空间,缺点造成内存浪费。

2.外因
修改内存中数据:修改包括增加和减少内存占用,例如原来的16K空间数据,增加或减少1K都会造成内存浪费。大量内存碎片的存在,会造成redis实际内存使用率降低,影响性能。


三、查看内存碎片

info memory 查看redis内存使用情况,主要关注以下参数

used_memory:                 redis分配的内存总量单位为b
used_memory_human:      redis分配的内存总量单位为M
used_memory_rss:           redis向操作系统申请的内存总量单位为b
used_memory_rss_human: redis向操作系统申请的内存总量单位为M
mem_fragmentation_ratio:     内存碎片率
mem_allocator:jemalloc-5.1.0 内存分配器

mem_fragmentation_ratio计算公式为:used_memory_rss/used_memory 该值大于1但小于1.5。这种情况是合理的。该值过高时考虑清理内存,例如该值大于1.5表示有50%空间浪费,需要清理内存碎片。


四、内存碎片清理

内存碎片清理,就是将不连续的内存空间重新整理为连续空间,由于redis是单线程,在清理过程中会造成堵塞,降低性能。可通过以下三种方式清理:

1.手动清理内存碎片

memory purge 只支持jemalloc内存分配器

2.自动清理

修改redis.conf配置文件

1

2

3

4

5

6

7

8


activedefrag yes 开启自动清理内存碎片,命令开启:config set activedefrag yes

active-defrag-ignore-bytes 100mb 内存碎片的字节数达到100M时开始清理

active-defrag-threshold-lower 10 内存碎片空间占操作系统分配给redis的总空间比例达到 10% 时开始清理

active-defrag-ignore-bytes与active-defrag-threshold-lower 两个条件同时满足会触发内存碎片清理,当有一个不满足则停止清理

active-defrag-threshold-upper 100 内存碎片超过 100%,则尽最大努力整理

active-defrag-cycle-min 1 自动清理过程所用CPU时间的比例不低于1%,保证能正常清理

active-defrag-cycle-max 25 自动清理过程所用CPU时间的比例不高于25%,超过25%停止清理,避免redis主线程阻塞

active-defrag-max-scan-fields 1000 自动清理过程中长度小于1000的set/hash/zset/list才会进行自动清理


----以上参数默认注释----

3.重启redis

到此这篇关于Redis 内存碎片原因及清理的文章就介绍到这了。

标签:清理,Redis,defrag,redis,碎片,内存,memory
From: https://blog.51cto.com/u_14585161/11876187

相关文章

  • Redis高可用方案:使用Keepalived实现主备双活
    注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装。1、使用版本说明Redis版本:5.0.2Keepalived版本:1.3.5Linux版本:Centos7.9查看Redis版本:/usr/local/redis/bin/redis-cli-v查看Keepalived版本信息:rpm-qa|grepkeepalived或者keepalived-v2、功能实......
  • 基于 Quanto 和 Diffusers 的内存高效 transformer 扩散模型
    过去的几个月,我们目睹了使用基于transformer模型作为扩散模型的主干网络来进行高分辨率文生图(text-to-image,T2I)的趋势。和一开始的许多扩散模型普遍使用UNet架构不同,这些模型使用transformer架构作为扩散过程的主模型。由于transformer的性质,这些主干网络表现出了良好......
  • Redis全体系:基础、高级特性与性能调优
    一、Redis的内存管理Redis作为一个内存数据库,性能的关键之一就在于其高效的内存管理。在了解Redis的内存管理之前,我们需要了解其存储结构。1.Redis对象和编码Redis中的每一个数据存储在内存中都是以对象的形式存在的。Redis对象包括以下几种:字符串对象:REDIS_STRING列表......
  • redis-shake4迁移数据(蛮好用)
    redis-shake下载地址:https://github.com/tair-opensource/RedisShake/releases测试环境redis需要从公有云迁移到私有云,就用redis-share测试一下。下载后解压(就两个文件,执行文件和配置文件): [root@gcv-x-test-sharedb-oracleredis]#catshake.toml##我只需要复制db0得数据......
  • Oracle 11g 数据库内存原理
    转自:1、https://blog.csdn.net/ly7472712/article/details/1162393882、https://www.cnblogs.com/prognani/archive/2012/05/14/2500679.htmlOracle11g数据库内存管理-----------------------------------------------------------------------------一、Oracle数据库内......
  • openGauss-大页内存
    openGauss-大页内存可获得性本特性自openGauss5.1.0版本开始引入。特性简介通过操作系统大页内存的使用,优化数据库的共享内存,提升在大内存环境下数据库的性能表现。客户价值提升客户在大内存生产环境下数据库的性能表现。特性描述操作系统页表所需空间会随着运行环境总......
  • Redis高可用方案:使用Keepalived实现主备双活
    注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装。1、使用版本说明Redis版本:5.0.2Keepalived版本:1.3.5Linux版本:Centos7.9查看Redis版本:/usr/local/redis/bin/redis-cli-v查看Keepalived版本信息:rpm-qa|grepkeepalived或者keepalived-v2、功能实现......
  • 利用 Redisson 实现延迟消息队列:一种高效订单取消方案
    文章目录一、发送延迟消息:定时触发订单取消二、监听延迟队列:自动处理过期订单三、取消订单的实现逻辑四、总结在电商平台中,订单生成后如果长时间未被处理,我们通常需要自动取消这些订单。这种需求不仅能够提升用户体验,还能有效管理库存和资源分配。而如何实现这一需......
  • 单线程Redis:Redis为什么这么快
    1Redis是不是单线程Redis使用后台线程执行耗时的I/O操作,以免阻塞主线程bio_close_file:后台I/O线程之一,异步关闭文件bio_aof_fsync:后台I/O线程之一,异步地将AOF(AppendOnlyFile)日志同步到磁盘bio_lazy_free:异步释放内存,有些内存释放操作可能比较耗时,因此这些操......
  • keil中内存的存储规律
    keil中内存的存储规律keil中内存的存储规律文章目录keil中内存的存储规律keil中内存的存储规律keil中内存的存储规律#include<stdlib.h>#include"gd32f30x.h"#include"led_drv.h"#include"delay.h"#include"key_drv.h"#include"systick.h"#......