Postgres recovery_prefetch 竟致服务中断

Postgres recovery_prefetch can cause outages

我在生产环境中发现了一个隐蔽却致命的隐患:Postgres 的 recovery_prefetch 功能正在悄悄引发服务中断。早在 2021 年就有开发者在邮件列表中提出过疑虑,但当时未被重视。如今,随着同步复制(synchronous replication)的普及和 FPI/FPW 的默认开启,该功能将主库的顺读操作转化为备库的随机读,导致 IOPS 激增 16 倍。一旦网络波动打断复制流,备库可能因 IOPS 耗尽而长时间无法追平,进而导致主库写入完全挂起。实验表明,在普通云盘上复现这一故障轻而易举,而关闭 recovery_prefetch 即可有效避免此类灾难。

当主实例执行大量顺序 I/O 时,recovery_prefetch 会将这些操作转化为 8k 随机读取,在读取相同字节数的情况下,备库的 IOPS 消耗可能放大 16 倍。

同日更多故事

2026-10-22