面试知识库

Redis 持久化 → OS fork → COW 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. BGSAVE流程:主线程fork() → 子进程遍历内存写RDB → 完成后替换旧文件 → 主线程继续服务
  2. fork为什么快:Linux COW只复制页表(~几千个页表项),不复制实际数据页;10GB实例fork约20ms
  3. COW代价:写入触发缺页中断 → OS为该页创建副本(4KB) → 高写入场景大量页被复制
  4. 内存规划maxmemory × 2 ≤ 物理内存(最坏情况);实际预留1.5倍足够(因为不是所有页都会被写)
  5. RDB vs AOF:RDB适合灾备(文件小恢复快),AOF适合数据安全(fsync=everysec最多丢1s);4.0+推荐混合持久化
  6. 代码示例
    # 监控COW内存开销
    grep "copy-on-write" /var/log/redis/redis.log
    # 输出: RDB: 128 MB of memory used by copy-on-write
    
    # 检查THP状态(建议关闭)
    cat /sys/kernel/mm/transparent_hugepage/enabled
    bash

面试回答串联#

30秒速答#

“RDB通过fork子进程做快照,利用OS的COW机制fork本身很快(10GB约20ms)。但高写入时COW导致大量页面复制,极端情况内存翻倍。AOF重写也fork,同样有COW风险。生产中预留1.5-2倍内存并关闭THP。“

2分钟展开答#

“Redis BGSAVE调用fork()创建子进程做RDB快照。fork本身很快因为Linux用COW——只复制页表不复制物理页,10GB的Redis实例fork约20ms。子进程和父进程共享物理内存页,写入时OS通过缺页中断为被修改的页创建副本(4KB),子进程仍然读取旧数据保证快照一致性。风险在于高写入场景下大量页被复制,内存使用可能翻倍——10GB实例最坏需要20GB物理内存。实际规划建议预留maxmemory的1.5-2倍。要注意关闭Transparent HugePage(THP),因为2MB大页放大了COW开销,修改一个字节要复制2MB而非4KB。AOF rewrite同样fork子进程重写压缩AOF文件,也有COW风险。Redis 7.0引入Multi Part AOF——将AOF拆成base+incr多文件,重写只替换base不影响增量,降低了rewrite风险。RDB和AOF的选择上,RDB适合灾备恢复(文件小速度快),AOF数据更安全(fsync=everysec最多丢1s数据),4.0+推荐混合持久化。“

相关追问链#