Bar*_*ski 3 postgresql linux outofmemoryerror memory-usage
我们有一个 postgres 9.0 实例,它运行在一台非常强大的机器上(96G RAM/24 个内核)。最近几周,我们经历了由于 OOM 杀手因内存不足而杀死 postgres 子进程而导致的崩溃。似乎由于使用连接池,这些子进程寿命很长(这是有道理的,因为打开和关闭连接需要时间),问题是它们的内存消耗逐渐增长,甚至达到 9Gigs/进程。正如您可能想象的那样,拥有 10 个这样的内存就可以填满可用的内存,并且 oom-killer 就会启动。
问题是:
作为参考,可能影响内存的设置:
max_connections = 950
shared_buffers = 32MB
Run Code Online (Sandbox Code Playgroud)
所有其他设置都不会被覆盖,这意味着我们使用默认值。
首先要考虑的是增加shared_buffers内存容量,至少增加到 1GB,甚至可能更多,最多增加到主内存的 25%。这就是医生所说的。
仅 32MB,其中约 18Mb 已被用于处理max_connections950 个子进程,子进程只能访问几乎足够的共享内存来共享任何内容。
对于您的特定工作负载和情况,这可能会也可能不会减轻内存消耗问题,但无论如何,这是朝着正确方向迈出的一步。目前的价值非常低。
特别是关于 OOM,您可能需要考虑文档的Linux 内存过量使用部分中提供的解决方法。但请注意,这是一个复杂问题的简短段落。例如,这篇博文及其评论中提供了更多内容,其中包含了解上下文以及限制或禁用 OOM 所涉及的权衡的指针。
除此之外,Postgres 中的内存泄漏总是可能的。您需要确保正在运行最新的次要版本,以防它已经修复。每个错误修复版本附带的发行说明肯定会不时提到内存泄漏。