操作手册 · 数据库与存储

待环境验证

Redis 内存压力与延迟诊断手册

区分 maxmemory、进程 RSS、复制与 AOF 缓冲,使用有界慢日志和单键采样定位压力,明确驱逐策略、处置审批及数据回退限制。

Redis监控告警高可用
阅读导引 · 理解后再操作

这篇知识解决什么问题

本篇把资源告警转成同一实例、同一时间窗的多层证据:业务等待、Redis 执行、RSS 余量以及复制持久化各自观察。内存下降或慢日志为空都不能单独说明问题解决;只读采样用于提出可否证假设,驱逐、扩容和切换仍属于独立决策。

内存不是只有一个可比较数值

数据分配、进程驻留、容器额度与复制持久化缓冲代表不同边界,数值同向或背离需要各自解释。先固定实例与版本,再用同窗口趋势和绝对规模判断风险;只看内部额度会漏掉进程压力,只看碎片比值也可能夸大规模很小的差异。

时间相关性只是下一检查的依据

业务延迟与 fork、磁盘或写入峰值重合,可以支持候选方向,却不能直接证明原因。应同时检查客户端等待、服务端样本及正常对照的反证,保留监控未启用和未覆盖的窗口;证据不足时不以生产压测或重任务强行制造所谓可复现结论。

进入文章正文
关联架构图解7 个组件 · 点击展开

引用场景图中的客户端、Redis、内存约束与既有观测关系,缓存回源分支只适用于确有该用途的业务。图没有展开每个分片、持久化模式或宿主机预算,不表示已完成性能优化与容量验证。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

Redis 内存、持久化与端到端延迟诊断架构

将客户端等待、Redis 执行、驱逐与 RSS 余量以及复制持久化开销分层对照,以限定采样提出最小处置;缓存场景还需观察回源压力。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

Redis 内存、持久化与端到端延迟诊断架构:组件关系图将客户端等待、Redis 执行、驱逐与 RSS 余量以及复制持久化开销分层对照,以限定采样提出最小处置;缓存场景还需观察回源压力。 业务客户端 → Redis 实例:批准的业务访问;业务客户端 → 已有业务后端:未命中回源;Redis 实例 → 复制 / 持久化:既有复制或落盘;内存与驱逐约束 → Redis 实例:限额与驱逐约束;Redis 实例 → 既有监控与采样:指标与采样响应;业务客户端 → 既有监控与采样:端到端请求基线;复制 / 持久化 → 既有监控与采样:复制与存储事件;既有监控与采样 → 处置评审与验收:假设与反证;处置评审与验收 → 内存与驱逐约束:获批措施评审。箭头说明见下方流向解读。
Redis 7.x/8.x 逻辑诊断参考图;回源支路仅适用于缓存用途,持久化和复制按现有部署确认,不表示已压测或优化。

业务客户端

入口 / 来源

确认真实实例、分片和业务用途,将连接等待、网络、重试与服务端执行时间分开。

全部组件职责 7 个组件
业务客户端
确认真实实例、分片和业务用途,将连接等待、网络、重试与服务端执行时间分开。
Redis 实例
只读获取获准的 INFO、有限慢日志和已知键元数据;不执行全量扫描、删除或切换。工具介绍 Redis 实例
已有业务后端
仅在 Redis 用作缓存且应用已有此逻辑时适用,观察驱逐或命中下降对后端的额外压力。
既有监控与采样
复用已有指标并补充有界授权采样,空字段和未启用延迟监测不能伪装成正常零值。工具介绍 既有监控与采样
内存与驱逐约束
maxmemory 不是进程或容器内存上限,分别核算复制/AOF 缓冲、碎片与 COW 余量。
复制 / 持久化
核对副本同步、后台保存和 AOF 重写的既有事件,完整保护多部分 AOF,不为诊断主动触发重写。工具介绍 复制 / 持久化
处置评审与验收
依据反证选择上游限流、数据模型、容量或存储责任路径,实际变更须另行批准并记录原值。
流向解读 9 条连接
  1. 1

    业务客户端 Redis 实例

    数据 / 请求 · 批准的业务访问

    表示应用原有读写,不通过额外生产负载或无界查询重现故障。

  2. 2

    业务客户端 已有业务后端

    数据 / 请求 · 未命中回源

    仅为已存在的缓存回源路径示意,Redis 若存储不可丢弃状态则此支路不适用。

  3. 3

    Redis 实例 复制 / 持久化

    数据 / 请求 · 既有复制或落盘

    具体 RDB、AOF 或复制由现场确认,不默认全部开启。

  4. 4

    内存与驱逐约束 Redis 实例

    控制 / 管理 · 限额与驱逐约束

    不同策略的候选键与写入错误行为不同,图示规则影响而不是自动修改配置。

  5. 5

    Redis 实例 既有监控与采样

    观测 / 查询 · 指标与采样响应

    获准诊断身份主动读取有限 INFO 与慢日志,Redis 返回采样结果;敏感参数脱敏,频率与范围有预算。

  6. 6

    业务客户端 既有监控与采样

    观测 / 查询 · 端到端请求基线

    客户端延迟与服务端慢日志覆盖范围不同,不能仅凭慢日志为空否定业务延迟。

  7. 7

    复制 / 持久化 既有监控与采样

    观测 / 查询 · 复制与存储事件

    对照既有磁盘、fork/COW、复制和持久化时间线定位相关性。

  8. 8

    既有监控与采样 处置评审与验收

    观测 / 查询 · 假设与反证

    同时考虑业务延迟、错误、命中、后端压力与容器余量,不只追求 used_memory 下降。

  9. 9

    处置评审与验收 内存与驱逐约束

    控制 / 管理 · 获批措施评审

    记录候选原值、配置来源、不可逆影响与停止阈值;本方案不直接调整实例。

故障域与操作边界

改回策略不能恢复已驱逐键

驱逐、TTL 到期与显式删除是不同事件;任何可能丢数据的处置都先确认用途和恢复来源。

内存压力下不要叠加重任务

不临时发起全量扫描、保存、AOF 重写或故障切换,部分缓冲不参与 maxmemory 驱逐比较。

观察范围不等于性能承诺

未覆盖高峰、措施未实施或根因未确认时保持待验证,实测结论不外推到全部分片和负载。

架构依据与版本核对 1 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与验证状态

本手册用于 Redis 7.x/8.x 常见内存压力、OOM 写入错误与响应延迟的证据化诊断,状态为待验证(PENDING)。字段与命令必须按实际版本、发行版、ACL 和托管服务限制复核;Redis 官方 latest 文档可能包含部署版本尚无的字段,不把字段缺失解释成数值为零。本文没有执行命令、压测、驱逐或故障切换,也没有证明任何环境已经达到性能目标。

适用入口是已获授权的具体实例及数据库编号。Sentinel 发现、Cluster 分片和代理入口须先映射到真正处理请求的节点;Cluster 不能通过一个节点的统计推断全部分片。若发现疑似数据丢失、持续重启或主从关系争议,先转入事故流程,不在诊断阶段改变角色。

一、先定义业务影响和采样预算

记录告警开始时间、业务 p95/p99、超时与重试率、命令类型、请求大小、连接池等待以及近期发布。缓存命中率下降引发后端数据库压力,与 Redis 自身命令执行变慢可能同时存在,应分别追踪。以受影响实例、业务前缀和十分钟观察窗作为建议初始范围,实际范围由值班负责人确认;不能为寻找一条慢命令无限采样。

在已批准 TLS 连接上使用最小诊断身份,凭据通过交互提示或受保护注入提供,不写进 URI、-a 参数或共享脚本。下面仅为连接形式示例,主机、CA、端口、用户及数据库必须人工替换。托管平台若仅提供控制台诊断,则使用其已授权入口,不绕过服务访问政策。Redis CLI 文档 说明连接及认证选项。

redis-cli --tls --cacert '/REPLACE_WITH_APPROVED_CA.pem' \
  -h 'REPLACE_WITH_APPROVED_HOST' -p 6379 \
  --user 'REPLACE_WITH_DIAGNOSTIC_USER' --askpass -n 0

二、把内存的四种口径分开

在上述已核实的交互连接内读取下列小范围信息,命令不在本站执行。先采一次基线,再按批准的间隔复查,不开紧密循环;共享报告应脱敏实例地址与拓扑信息。

INFO server
INFO memory
INFO stats
INFO replication
INFO persistence

used_memory 理解为 Redis 分配器统计,而 used_memory_rss 是进程驻留内存;容器内存限制及同机其他进程还构成另一层约束。maxmemory 是 Redis 驱逐决策相关限制,不是操作系统 RSS 上限。mem_fragmentation_ratio 还包含其他进程开销,不能单凭比值高就确认碎片,应看字节差、分配器指标及绝对规模。字段定义见 INFO

把监控图分成数据集、RSS/容器余量、复制与持久化、业务延迟四组,保留同一时间轴。推荐把两个采样点之间的计数变化与流量一起解释:实例重启可能重置累计计数,监控断点不是零压力。不要将多个实例的平均值掩盖单分片热点,也不把一次短暂峰值直接当成扩容依据。

三、理解驱逐、TTL 与不能驱逐的内存

LRU 驱逐在内存策略触发时选择较少近期使用的候选键,Redis 使用近似算法;它不是到期删除,也不是对任意内存开销的清理。allkeys-lru 可从全部键选择,volatile-lru 只选择带 TTL 的键;无候选键时后者不能保证写入成功。noeviction 不主动为新写入驱逐键,部分需要新增内存的命令会报错,因此先确认数据是否允许丢弃,再谈策略选择。驱逐机制 给出这些差异。

复制和 AOF 的部分缓冲不会计入驱逐比较,可通过 mem_not_counted_for_evict 观察,故 maxmemory 尚未触顶仍可能遇到进程或容器内存危机。预算应为复制、持久化和进程开销保留余量,不能把主机全部内存设为数据集额度。订单状态、分布式锁或会话等用途未经业务确认,不因临时压力就改成全键驱逐;已驱逐数据也不能通过改回旧配置自动复原。

四、把持久化峰值与复制积压单独调查

检查 INFO persistence 的 RDB/AOF 后台状态、最近成功或失败结果、fork/COW 相关字段及既有磁盘延迟监控;再对照 INFO replication 的角色、链路、复制偏移与缓冲趋势。Redis 7 起采用多部分 AOF,基础文件、增量文件和 manifest 构成一个整体,不把某个大 AOF 文件视为可随意删除的垃圾。背景保存或重写涉及额外内存与 I/O,不能在内存危急时盲目再触发一次。持久化文档 说明机制与版本变化。

若上游写入突增同时带来复制积压,限流对象应由业务负责人确认;若 AOF 写入失败,优先保护数据与证据并处理已定位的存储问题。禁止为了消除告警临时关闭持久化、删除持久化文件或切换到未核验副本。Sentinel 故障转移本身不能解决所有节点共享的容量不足,并可能引入新的数据缺口。

五、慢日志与客户端延迟不能画等号

在获准读取敏感命令元数据后,至多取十条慢日志,并读取已启用的延迟监控结果。慢日志中可能含键名、命令参数和客户端信息,只保存必要脱敏摘要,不把原始输出贴到公开知识库。

SLOWLOG GET 10
LATENCY LATEST

慢日志主要反映服务端命令执行耗时,不能覆盖客户端连接池等待、网络往返和全部排队时间;见 Redis 延迟诊断SLOWLOG GETLATENCY LATEST 没有结果可能是监控未启用或没有采样到阈值事件,不等于用户没有延迟;诊断期间不无条件 CONFIG SET 开启或调低阈值。

将超时先拆为连接建立、池等待、发送、服务端处理和读取响应,再匹配 CPU、磁盘及持久化事件。建议每个假设至少附一个支持证据和一个排除条件,例如“同一分钟 fork 事件与延迟同向”只能支持相关性,需要重复窗口或隔离试验才能形成因果判断。不要用生产压测、长期 MONITOR 或重复大查询制造诊断噪声。

六、按已知键优先,扫描必须有停止边界

优先从应用负责人提供的脱敏键模式和具体样本定位。以下只读示例只查一个已批准键;不获取键值,不使用全量嵌套采样。MEMORY USAGE ... SAMPLES 5 对嵌套对象给出采样估计,不是所有元素的精确总和;TTL-1 表示无过期设置,-2 表示键不存在,二者都不能解释为立即过期。MEMORY USAGETTL 提供参数语义。

TYPE APPROVED_SAMPLE_KEY
TTL APPROVED_SAMPLE_KEY
MEMORY USAGE APPROVED_SAMPLE_KEY SAMPLES 5

确需搜索时先审批前缀、数据库和实例,建议上限为五次游标调用、每秒最多一次、累计十秒,任一条件达到即停止并记录“部分样本”。SCANCOUNT 只是工作量提示,不是结果硬上限;MATCH 不等于索引查询,且可能空结果但游标未结束、出现重复键,不把部分扫描当完整快照。SCAN 文档 解释迭代限制。

本手册不提供无界扫描循环,也不使用 KEYS *FLUSHALL、全库 --bigkeys 扫描或按通配符删除。任何批准采样一旦显著抬升 CPU、p99 或超时,就停止发出后续请求;应保留已收集证据,不为完成预定次数继续施压。

七、处置选项与回退限制

按证据选择最小变更:写入突增可评审应用限流与重复请求抑制;异常对象增长可评审上游数据结构与 TTL 生命周期;非可丢弃状态应评审隔离用途或容量迁移;持久化与复制压力应先处理对应瓶颈。每项动作都需要负责人、目标实例、预期信号、停止条件、观察窗口与独立审批,本文不直接下发任何配置或删除命令。

扩容前确认宿主机余量、COW 峰值及故障时副本承载能力;提高 maxmemory 可能把 Redis 内部错误变成操作系统 OOM。降低额度或更换驱逐策略可能立即产生数据淘汰,不能承诺可逆。对已批准的配置变更,保存原值和配置来源,运行时值与部署配置应一致;恢复旧值只是配置回退,不代表键内容或业务状态已经恢复。

八、验收与交接

用批准的真实负载窗口核对 p95/p99、超时、错误、命中率、后端数据库压力、RSS/容器余量、驱逐趋势及持久化/复制状态。一次 PING 成功和单次内存下降都不足以结案。验收需注明窗口、样本规模、未覆盖时段和剩余风险;无法观察高峰就列入后续验证,不虚构高峰成绩。

建议工单保留:实例和版本、业务用途、原策略与额度、脱敏采样时间轴、根因假设及反证、批准动作、实际结果、停止或回退记录、容量责任人与复查时间。发现数据被驱逐后应单独追踪业务重建和一致性,不只关闭资源告警。没有实际执行和复核结果时,知识条目继续标为 PENDING。

相关站内内容

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. Redis 内部内存尚未触及额度,进程 RSS 或容器余量却持续恶化,同期复制或持久化事件增多。

    只读核对
    只读比对同实例 INFO 内存、复制与持久化字段和既有容器、COW 及磁盘趋势,记录实际版本与缺失项。
    如何判读
    可能包含不参与驱逐的缓冲、进程开销或持久化峰值;内部额度未满不能证明操作系统没有内存风险。
  2. 应用 p99 与超时升高,但有限慢日志和延迟事件没有对应记录,采集是否启用也尚未确认。

    只读核对
    读取已有客户端连接池、网络与重试指标及有限脱敏慢日志,核对记录阈值、窗口和实例是否对应。
    如何判读
    慢日志不覆盖全部端到端等待,空结果可能是未启用或未采到;仍需对照客户端与服务端,不能否定延迟。
  3. 驱逐计数增加、命中率下降并伴随后端压力,但部分业务把 Redis 用于不可随意丢弃的状态。

    只读核对
    只读核对批准样本的用途、TTL 元数据、当前策略和计数时间轴,结合实例重启及已有业务错误记录。
    如何判读
    可能是容量或生命周期失配,计数还需排除重置;改回策略不会恢复已驱逐键,数据影响须独立追踪。
常见误区与判断边界 2 项

把 maxmemory 提高到主机上限

内部额度不等于进程内存上限,复制、AOF 缓冲与持久化峰值可能继续使用额外空间。把全部余量让给数据集可能只是把 Redis 写入错误转成系统 OOM;应先用只读证据解释各口径与业务用途,再将容量或策略变更交给责任人评审,不能直接套一个比例。

为找大键进行无界全库采样

扫描会增加负载且部分结果并非完整快照,已有键模式和精确样本通常更适合收窄假设。COUNT 也不是结果硬上限,不能据此声称扫描不会超预算;本篇只补充获准的有限取证思路,不用全库扫描、持续 MONITOR 或删除命令来制造诊断数据。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 记录真实实例、角色、分片、版本和业务用途,保存客户端延迟、错误与连接等待的时间窗,避免用平均值掩盖热点。
  • 关联数据分配、RSS、容器余量及复制持久化趋势,解释累计计数重置与缺失字段,不将无法采集的数值填为正常零。
  • 保留有限慢日志和已知键元数据的脱敏结果及采样预算,明确查询范围、监控阈值和未覆盖窗口,避免公开命令参数。
  • 交接每个假设的支持与反证、候选处置责任和数据丢失边界,已驱逐状态单独追踪,不以资源告警消失作为业务恢复。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。