Postgres 子进程占用大量内存

Bar*_*ski 3 postgresql linux outofmemoryerror memory-usage

我们有一个 postgres 9.0 实例,它运行在一台非常强大的机器上(96G RAM/24 个内核)。最近几周,我们经历了由于 OOM 杀手因内存不足而杀死 postgres 子进程而导致的崩溃。似乎由于使用连接池,这些子进程寿命很长(这是有道理的,因为打开和关闭连接需要时间),问题是它们的内存消耗逐渐增长,甚至达到 9Gigs/进程。正如您可能想象的那样,拥有 10 个这样的内存就可以填满可用的内存,并且 oom-killer 就会启动。

问题是:

  1. 如果我们使用默认配置参数,进程怎么可能分配这么多内存?
  2. 为什么这些进程不释放内存?

作为参考,可能影响内存的设置:

max_connections = 950
shared_buffers = 32MB
Run Code Online (Sandbox Code Playgroud)

所有其他设置都不会被覆盖,这意味着我们使用默认值。

Dan*_*ité 5

首先要考虑的是增加shared_buffers内存容量,至少增加到 1GB,甚至可能更多,最多增加到主内存的 25%。这就是医生所说的

仅 32MB,其中约 18Mb 已被用于处理max_connections950 个子进程,子进程只能访问几乎足够的共享内存来共享任何内容。

对于您的特定工作负载和情况,这可能会也可能不会减轻内存消耗问题,但无论如何,这是朝着正确方向迈出的一步。目前的价值非常低。

特别是关于 OOM,您可能需要考虑文档的Linux 内存过量使用部分中提供的解决方法。但请注意,这是一个复杂问题的简短段落。例如,这篇博文及其评论中提供了更多内容,其中包含了解上下文以及限制或禁用 OOM 所涉及的权衡的指针。

除此之外,Postgres 中的内存泄漏总是可能的。您需要确保正在运行最新的次要版本,以防它已经修复。每个错误修复版本附带的发行说明肯定会不时提到内存泄漏。