Postgres的subprocess吃掉了很多的内存

我们有一个postgres 9.0实例运行在一个非常强壮的机器上(96G的RAM / 24核心)。 在最近几个星期里,我们遇到了由于OOM杀手内存不足而导致postgres被杀的儿童进程的崩溃。 看起来,由于使用连接池,这些subprocess是长寿命的(这是合理的,因为打开和closures连接需要时间),问题在于它们在内存消耗上逐渐增长以至达到9Gig / process。 你可以想象,其中有10个,填补了可用的公羊和OOM杀手踢。

问题是:

  1. 如果我们使用默认configuration参数,那么进程如何分配这么多的内存呢?
  2. 为什么这些stream程并没有释放内存呢?

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

max_connections = 950 shared_buffers = 32MB 

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

首先要考虑的是增加shared_buffers方式,至less1GB,甚至更多,最多占主内存的25%。 这就是医生说的 。

只有32MB,其中〜18Mb已经被用来处理max_connections到950,subprocess只能访问足够的共享内存来共享任何东西。

这可能会也可能不会缓解您的具体工作负载和情况的内存消耗问题,但无论如何,这是朝着正确的方向迈出的一步。 目前的价格是疯狂的低。

关于OOM,您可能需要考虑文档的Linux内存过量使用部分提供的解决方法。 但请注意,这是一个复杂问题的简短段落。 还有更多例如在这篇博客文章和它的评论,指出了解限制或禁用OOM所涉及的上下文和权衡。

除此之外,Postgres中的内存泄漏始终是可能的。 您需要确保您正在运行最新的次要版本,以防已经修复。 每个bugfix-release附带的发行说明都会不时提及内存泄漏。