内存告警阈值的分层设计
内存告警要分两层:水位类指标(用量占上限的比例、RSS 与容器限额的距离)反映趋势,活动类指标(淘汰速率、过期速率、碎片率)反映此刻正在发生什么,只看其中一类必然误判。阈值还必须按角色与用途区分:主库与副本的余量需求不同,缓存型与存储型实例的安全水位也不一样,直接套用别处模板会同时出现误报和漏报。告警触发后的第一步是取证与降级观察,而不是立刻重启或清库。
基本信息
| 水位类 | used_memory 与 maxmemory 的比值 |
|---|---|
| 系统类 | RSS 与容器限额的差值 |
| 活动类 | evicted_keys、expired_keys 速率 |
| 质量类 | mem_fragmentation_ratio |
| 区分维度 | 主从角色、缓存或存储用途 |
| 数据来源 | INFO memory 与 INFO stats |
典型使用场景
- 为新建实例设计内存告警规则,避免照搬其他业务模板
- 内存长期高位但无淘汰,判断是否需要提前扩容
- 淘汰速率持续为正,说明容量已经不够,需要提前介入
- 区分主库与副本的告警口径,减少无效告警
- 复盘一次内存事故,核对当时的告警是否覆盖了真实信号
- 为容器化实例增加 RSS 与限额差值的专项告警
取证命令
取证命令
redis-cli INFO memory | grep -E 'used_memory:|maxmemory:'
redis-cli INFO memory | grep -E 'mem_fragmentation_ratio'
redis-cli INFO stats | grep -E 'evicted_keys|expired_keys'
redis-cli INFO clients # 客户端缓冲是否异常
redis-cli INFO replication | grep -E 'role|master_link'
free -m && cat /sys/fs/cgroup/memory.current # 系统与容器侧告警项设计对照
| 监控项 | 阈值思路 | 常见误报 |
|---|---|---|
| 水位占比 | 按上限比例分多级 | 未按角色区分 |
| 淘汰速率 | 持续为正即关注 | 短时淘汰被当成故障 |
| 碎片率 | 超过经验值做提示 | 忽略 fork 期间波动 |
| RSS 与限额差值 | 按容器余量设置 | 容器参数变化未同步 |
阈值触发后先取证、降级观察,再决定动作,避免人工恐慌操作引入新问题。
只有总量告警、没有活动告警时,趋势恶化期完全看不到信号,等报出来往往已经没有缓冲时间。