磁盘满必然导致rdb生成失败,因rdb写入需峰值约2倍数据集空间,且同时消耗block和inode;df -h与df -i必须并查,iuse%达100%时即使有空间也无法创建文件。

磁盘满直接导致 RDB 生成失败,不是“可能”,而是必然。RDB 写入需要临时空间(峰值 ≈ 2 × 当前数据集大小),AOF 重写更会三份文件并存,不清理就卡死。
查清是不是真满:df -h 和 df -i 都得看
只看 df -h 显示 “还有 5% 空间” 不代表安全——df -i 可能显示 inode 已 100% 耗尽,尤其日志多的小文件场景。Redis 写 RDB 时既需要 block 空间,也需要 inode。错误日志里出现 No space left on device 时,必须两个命令一起跑:
-
df -h确认dir配置指向的挂载点(比如/var/lib/redis)是否 Use% ≥ 95% -
df -i查同一挂载点的 IUse%,超 95% 就要清小文件或重启进程释放 deleted inode - 别信监控面板的“可用空间”,用
dd if=/dev/zero of=/tmp/test bs=1M count=100实测写入延迟是否异常高
临时止血:config set maxmemory + 收紧 AOF 重写阈值
不重启、不改配置文件也能压住数据膨胀节奏:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 执行
config set maxmemory 4gb(按物理内存 70% 设,比如 8GB 机器设 5.6GB)——从源头掐断 RDB/AOF 体积增长 - 收紧 AOF 重写条件:
config set auto-aof-rewrite-percentage 50+config set auto-aof-rewrite-min-size 256mb,避免小实例频繁重写 - 确认
dir指向独立大容量分区(如/data/redis),且该路径下没混放其他服务日志
清理空间要绕开 Redis 正在写的文件
直接 rm -f dump.rdb 或 rm -f appendonly.aof 很危险——如果 Redis 正在读写这些文件,删了也不会立即释放空间,还可能触发崩溃:
- 清日志用
truncate -s 0 /var/log/redis/redis-server.log,保留句柄,空间秒退 - 删归档日志:
find /var/log/redis -name "redis-server.log.*" -mtime +7 -delete - AOF 文件巨大?先
redis-cli CONFIG SET appendonly no关闭,再删旧文件;RDB 文件确认非主从实例正在用再删 - inode 耗尽时,
lsof | grep deleted找残留句柄,对对应 PIDkill -TERM释放
fork 失败不是磁盘问题,是 overcommit_memory=0 撞上的
日志里看到 Can't save in background: fork: Cannot allocate memory,但 df -h 和 free -h 都显示空间充足——这基本锁定是内核参数问题:
-
vm.overcommit_memory = 0(默认)会让 fork 前检查物理内存+swap 是否够用,而 copy-on-write 的子进程实际用不到那么多,却因预检失败 - 临时修复:
echo 1 > /proc/sys/vm/overcommit_memory - 永久生效:在
/etc/sysctl.conf加vm.overcommit_memory = 1,再sysctl -p - Docker 容器里改不了宿主机参数?那就必须调大容器内存 limit 或关掉 RDB,只留 AOF
真正棘手的是磁盘满和 fork 失败常同时发生,日志里两条错误堆在一起。先用 df -h 和 df -i 锁定空间问题,再看有没有 fork: Cannot allocate memory ——顺序错了,修半天白忙。










