0
点赞
收藏
分享

微信扫一扫

Redis实例内存使用率高排查

背景

当实例内存不足时,会触发内存淘汰策略,可能大致key被频发逐出,可能会导致应用响应时间等不稳定的问题,通常在内存90%时,我们需要及时的介入,分析内存的使用

内存简介

Redis 内存主要有如下三个部分组成

内存使用

简要说明

链路内存

主要包括Input Buff、Output Buff、JIT Overhead、Fake Lua Link、Lua执行缓存,客户端连接消耗内存等

数据内存

用户数据,即实际存储的Value信息,

管理内存

主要包括一些复制buffer,aof数据持久化buffer,hashtable数据接口的内存开销(key)

分析及排查

  1. 查看redis 内存监控数据,查看内存使用率情况

Redis实例内存使用率高排查_数据

  1. 查询key的总数,及历史新增趋势,是否是由业务增来,带来key的增多,从而导致内存占用偏高

Redis实例内存使用率高排查_数据_02

  1. 通过自研Redis RDB分析平台查看key的业务属性,过期时间及大key情况

Redis实例内存使用率高排查_数据_03

  1. 内存使用率不符合使用预期,特别是rdb分析的结果与真实的使用不一致,可通过 进入redis实例执行 MEMORY STATS 查看你内存使用详情
1) "peak.allocated" //Redis进程自启动以来消耗内存的峰值。
2) (integer) 79492312
3) "total.allocated" //Redis使用其分配器分配的总字节数,即当前的总内存使用量。
4) (integer) 79307776
5) "startup.allocated" //Redis启动时消耗的初始内存量。
6) (integer) 45582592
7) "replication.backlog" //复制积压缓冲区的大小。
8) (integer) 33554432
9) "clients.slaves" //主从复制中所有从节点的读写缓冲区大小。
10) (integer) 17266
11) "clients.normal" //除从节点外,所有其他客户端的读写缓冲区大小。
12) (integer) 119102
13) "aof.buffer" //AOF持久化使用的缓存和AOF重写时产生的缓存。
14) (integer) 0
15) "db.0" //业务数据库的数量。
16) 1) "overhead.hashtable.main" //当前数据库的hash链表开销内存总和,即元数据内存。
2) (integer) 144
3) "overhead.hashtable.expires" //用于存储key的过期时间所消耗的内存。
4) (integer) 0
17) "overhead.total" //数值=startup.allocated+replication.backlog+clients.slaves+clients.normal+aof.buffer+db.X。
18) (integer) 79273616
19) "keys.count" //当前Redis实例的key总数
20) (integer) 2
21) "keys.bytes-per-key" //当前Redis实例每个key的平均大小,计算公式:(total.allocated-startup.allocated)/keys.count。
22) (integer) 16862592
23) "dataset.bytes" //纯业务数据占用的内存大小。
24) (integer) 34160
25) "dataset.percentage" //纯业务数据占用的内存比例,计算公式:dataset.bytes*100/(total.allocated-startup.allocated)。
26) "0.1012892946600914"
27) "peak.percentage" //当前总内存与历史峰值的比例,计算公式:total.allocated*100/peak.allocated。
28) "99.767860412597656"
29) "fragmentation" //内存的碎片率。
30) "0.45836541056632996"

优化及处理

  1. 分析key是否符合业务预期,是否设置合理的过期的时间
  2. 根据业务需求,设置合理的数据逐出策略(即调整maxmemory-policy参数的值)
  3. 根据业务需求,设置合理的过期Key主动删除的执行频率
举报

相关推荐

0 条评论