我在 Kube 中运行 PostgreSQL 15。因此,在重负载下,当 RAM 使用率达到 100% 时,WAL 写入器就会崩溃并中止。由于 pid 的存在,如果没有干预,它永远不会再次出现。因此,理想情况下,我想限制其 RAM(就像我们可以在 linux 中使用 cgroups 那样),假设使用率为 90%。所以我想听听限制 Pod 中 PostgreSQL 集群的 CPU 和 RAM 使用的最佳方法是什么。我认为这里 cgroup 不是一个好的解决方案,因为如果没有 pod 重新启动,PostgreSQL 重新启动可能会很危险。
不,cgroups 是一种非常糟糕的 PostgreSQL 内存管理方式。它给你两个选择:
超过限制的进程被 OOM Killer 杀死
超出限制的进程将冻结,直到其他进程释放内存
第一个会使 PostgreSQL 崩溃(但除非你配置错误,否则它会再次出现),第二个也不是一个可行的解决方案。
诀窍是配置
shared_buffers
、work_mem
、、max_connections
,以便 PostgreSQL 永远不会达到限制。“未使用”的内存没有问题,因为 PostgreSQL 将使用它进行缓存。maintenance_work_mem
hash_mem_multiplier
没有安全的规则来确定这些参数的大小,但在大多数情况下有效的经验法则是
shared_buffers
+2 *
work_mem
*max_connections
+maintenance_work_mem
*autovacuum_max_workers
≤ 内存