PostgreSQL and the Linux OOM Killer: A Better Default
5 hours ago
- 内存过量分配允许Linux分配超出物理内存的地址空间,仅在首次访问时使用物理页面;当已访问的页面超过RAM时,过量分配可能触发OOM杀手。
- Postgres容易遭受OOM杀手的攻击,因为共享内存段(缓冲区、WAL、锁)在后端之间共享;SIGKILL可能破坏该段,迫使postmaster通过崩溃恢复重启整个实例。
- 严格过量分配(vm.overcommit_memory=2)使内核跟踪已提交的内存,并拒绝超出限制的分配,返回ENOMEM而非杀死进程。
- Postgres将ENOMEM视为查询错误:事务回滚,查询失败并显示
- 内存不足
- ,其余连接不受影响。
- ClickHouse托管Postgres使用严格过量分配,限制设置为可用内存的80%(不包括大页面)加2GB,结果约为总RAM的60%加2GB。
- 在m7i.2xlarge实例上的实验比较:在默认策略下,OOM杀死了一个后端,导致30.2秒的停机时间,并丢弃了所有20个旁观会话;在严格过量分配下,单个查询失败并显示错误,而19个会话继续运行,没有发生停机时间。
- 严格过量分配的性能开销可以忽略不计:仅查询吞吐量差异2.2%,读写吞吐量差异0.6%,在运行间波动范围内。
- 关键要点:内存耗尽不可避免;策略决定了成本——严格过量分配将损失限制为单个查询错误,而默认策略可能导致实例范围的重新启动。