Redis AOF rewrite 期间如何判断磁盘与内存压力
我在排查 Redis AOF rewrite 时最容易踩的坑,是把“Redis 已用内存没有明显上涨”和“磁盘还能写”当成同一件事。实际上,重写会 fork 子进程:子进程生成更紧凑的 AOF base 文件,主进程继续接收写入;写入越密集,COW(Copy-on-Write)页面和增量 AOF 写入就越值得警惕。
判断这段重写能不能继续,至少要同时看四件事:INFO persistence的重写/COW 状态、INFO memory的 RSS、文件系统剩余空间,以及 fsync 是否排队。used_memory单独看不出完整风险。
- 内存重点看
current_cow_size、current_cow_peak、used_memory_rss和系统可用内存的趋势。 - 磁盘要把“空间不足”和“设备繁忙”分开处理,前者是硬阻断,后者通常先错峰或限流。
- Redis 7.0+ 使用多部分 AOF,旧资料里的
aof_rewrite_buffer_length已移除,不能再拿它做通用判断。
AOF rewrite 为什么会同时抬高内存和磁盘压力
重写不是把旧 AOF 原样复制一遍,而是根据当前数据集生成更短的 base 文件。Redis 通过 fork 创建后台子进程,主进程仍服务客户端。两者起初共享页面;主进程在重写期间修改某个页面时,操作系统才产生 COW 副本。因此风险与“重写时有多少数据被写到”有关,不只是数据集有多大。
在 Redis 7.0 及以后,主进程会继续写新的 incremental AOF,子进程负责生成 base AOF,最后通过清单原子切换。于是至少存在两类压力:COW 让进程 RSS 可能抬高,base/incremental 文件和 fsync 又会占用磁盘带宽与空间。

先用 INFO persistence 看重写是否正在制造额外开销
第一组指标回答“现在是不是重写中,以及额外内存从哪里来”。可以定时采样下面的字段:
# 只读取重写状态和 COW 相关字段,不修改 Redis 配置
redis-cli INFO persistence | grep -E 'aof_rewrite_in_progress|aof_current_rewrite_time_sec|current_cow_size|current_cow_peak|aof_last_bgrewrite_status|aof_pending_bio_fsync'
aof_rewrite_in_progress:1 表示当前重写仍在进行;current_cow_size 是当前 COW 大小,current_cow_peak 用来观察本次运行中的峰值。重写结束后,再看 aof_last_cow_size、aof_last_rewrite_time_sec 和 aof_last_bgrewrite_status,才能判断这次是否成功收尾。
如果是 Redis 7.0+,不要因为找不到 aof_rewrite_buffer_length 就认为采集失败。官方 INFO 文档明确说明该字段已移除,应改看 COW、AOF buffer 和 fsync 相关指标。
内存压力要对照 RSS、COW 和分配器碎片
used_memory 更接近 Redis 分配器已分配的内存,而 used_memory_rss 是操作系统看到的常驻集。重写期间,COW 页面可能让 RSS 先上涨;另外分配器碎片、客户端缓冲和 AOF 缓冲也会占用主机内存。
# 组合 Redis 内存、RSS、碎片和持久化状态,便于每秒采样比较趋势
redis-cli INFO memory | grep -E 'used_memory:|used_memory_rss:|mem_fragmentation_ratio:|allocator_rss_bytes:'
redis-cli MEMORY STATS
我的判断顺序是:先确认 current_cow_peak 是否持续增长,再看 used_memory_rss 是否逼近主机可用内存;最后用 MEMORY STATS 分辨 AOF、客户端和 allocator 的额外开销。系统可用内存快速下降、COW 峰值不断刷新时,应先降低重写窗口内的写入峰值或延后重写,而不是急着把 maxmemory 调到物理内存上限。
磁盘压力分成空间、吞吐和 fsync 排队
磁盘剩余空间是最硬的边界。先确认 AOF 目录所在挂载点,再看设备是否忙,以及 Redis 是否有待处理的 fsync:
# 路径替换为 appenddirname 对应的实际挂载点;这里只读系统状态
df -h /var/lib/redis
df -i /var/lib/redis
iostat -dx 1
# 查看 AOF 写入与 fsync 排队状态
redis-cli INFO persistence | grep -E 'aof_pending_bio_fsync|aof_delayed_fsync|aof_buffer_length|aof_current_size|aof_base_size'
空间不足时不要继续手工触发 BGREWRITEAOF;应先清理或扩容,并确认 AOF 目录中的 base、incremental 文件和 manifest 关系。设备利用率长期很高、aof_pending_bio_fsync 增长,则更像 I/O 饱和或 fsync 竞争,处理重点是错开备份、降低写入突发,或评估 no-appendfsync-on-rewrite。
appendfsync everysec 通常是速度与持久性的折中。将 no-appendfsync-on-rewrite 设为 yes 可以减少重写时的 fsync 压力,但会改变故障时的数据持久化边界,不能把它当成无代价的性能开关。
用检查清单决定继续、错峰还是暂停
| 观察结果 | 更可能的风险 | 动作 |
|---|---|---|
| 空间接近运维下限 | 新 AOF 文件无法完整落盘 | 先扩容或释放空间,暂停手工重写 |
| COW 峰值和 RSS 同时上升 | 写入触发页面复制,内存峰值放大 | 错开高写入窗口,给主机和 Redis 留余量 |
| fsync 排队增长、设备长期繁忙 | 持久化 I/O 竞争导致延迟 | 错开备份和重写,评估 fsync 策略 |
| 重写完成且状态成功、曲线回落 | 本次资源峰值已解除 | 记录峰值,更新下次重写的容量预算 |
这里不建议写一个对所有实例都适用的“剩余百分比”。更可靠的边界是用历史峰值估算:数据集、COW 峰值、分配器碎片、客户端缓冲、AOF 文件增长和系统自身开销,都要留在同一台主机的可用资源内。重写完成后,确认 aof_rewrite_in_progress:0、最后状态成功、磁盘空间和延迟恢复,再关闭这次观察。

相关问题
为什么 used_memory 没涨,机器内存却快满了?
因为 RSS 还包含 COW 页面、分配器驻留页和其他进程开销。重写期间应同时看 used_memory_rss、current_cow_peak 与系统可用内存。
Redis 7.0+ 还能看 aof_rewrite_buffer_length 吗?
不能把它当作通用指标。该字段在 Redis 7.0 被移除,改用 current_cow_*、AOF buffer 和 fsync 相关字段组合判断。
no-appendfsync-on-rewrite 应该一直设为 yes 吗?
不应该。它是降低重写期间 fsync 压力的取舍项,是否采用取决于磁盘延迟和可接受的数据持久化风险,必须在目标负载下压测并监控。
MySQL EXPLAIN ANALYZE 如何观察临时表和排序开销
- 上一篇
- MySQL EXPLAIN ANALYZE 如何观察临时表和排序开销
- 下一篇
- Go hmac.Equal 为什么比字符串比较更适合校验签名
-
- 数据库 · Redis | 6分钟前 |
- Redis pipeline 批量命令为什么不是事务
- 320浏览 收藏
-
- 数据库 · Redis | 2小时前 | Redis · 集群 · 分布式缓存 · redis Redis Cluster CROSSSLOT Hash Tag
- Redis Cluster 客户端遇到 CROSSSLOT 时如何重构 key
- 218浏览 收藏
-
- 数据库 · Redis | 3小时前 |
- Redis 主从复制延迟如何从 offset 判断
- 402浏览 收藏
-
- 数据库 · Redis | 4小时前 | Redis · 缓存 · 内存淘汰 · redis lru maxmemory-policy LFU
- Redis LRU 和 LFU 淘汰策略如何按访问特征选择
- 106浏览 收藏
-
- 数据库 · Redis | 10小时前 | Redis · 有序集合 · ZRANGEBYLEX · redis Sorted Set ZRANGEBYLEX 字典序分页
- Redis ZRANGEBYLEX 如何按字典序取一段成员
- 482浏览 收藏
-
- 数据库 · Redis | 11小时前 |
- Redis keyspace notification 为什么收不到过期事件
- 321浏览 收藏
-
- 数据库 · Redis | 1天前 | Redis · 权限控制 · ACL · key pattern ·
- Redis ACL 按命令和 key pattern 限制权限怎么写
- 207浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Cluster 多 key 命令为什么要求 hash tag
- 372浏览 收藏
-
- 数据库 · Redis | 1天前 | 内存 · Redis · 缓存 · LRU · ttl · redis maxmemory-policy allkeys-lru 内存淘汰 volatile-ttl
- Redis maxmemory-policy 选 allkeys-lru 还是 volatile-ttl
- 288浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 107次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 22次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 33次使用
-
- AGI-Eval
- AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
- 23次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 260次使用
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 一文搞懂Go语言操作Redis的方法
- 2023-01-07 171浏览
-
- Golang分布式应用之Redis示例详解
- 2023-01-07 113浏览
-
- Go Redis客户端使用的两种对比
- 2022-12-30 195浏览

