ERROR: out of memory

版权声明:本文为博主原创之文章,未经博主允许谢绝转载。 https://blog.csdn.net/pg_hgdb/article/details/87774443

PostgreSQL运行过程中,可能会发生内存不足(OOM)的错误,报错示例如下:

ERROR: out of memory

问题产生的原因

1)由于内核实现内存过量使用的方法,如果PostgreSQL或其它进程的内存要求导致系统用光虚拟内存,那么内核可能会终止PostgreSQL的postmaster进程(主服务器进程)。

2)当操作系统的OOM killer进程由于整个系统内存不足而启动时,可能会出现此类消息:

LOG: server process (PID xxxx) was terminated by signal 9: Killed

3)PostgreSQL可以处理明显的的内存不足错误,如果你只有一个瞬间出现内存不足的情况,它将在不重启数据库的情况下恢复,并且不会造成数据库崩溃。

4)如果收到OOM killer消息,这表明postgres进程因为内存压力而被终止了。尽管现有的数据库连接将继续正常运转,但是新的连接将无法被接受。应重启PostgreSQL进行恢复。

解决方法

1)首先,可以选择捕获完整日志信息以便进行分析。

2)如果内存资源紧张,增加操作系统的交换空间会有帮助,因为OOM killer只有当物理内存和交换空间都被用尽时才会被调用。

3)如果PostgreSQL本身是导致系统内存耗尽的原因,可以更改配置参数。在某些情况下,降低内存相关的配置参数可能有所帮助,特别是shared_buffers和work_mem这两个参数。其他的情况下,允许太多连接到数据库服务器本身也可能导致该问题,最好降低max_connections参数并且转而使用外部连接池软件。如果您经常遇到此类内存不足(OOM)错误,那么首先要做的就是降低work_mem参数的值,这样可以提高稳定性,但是代价是更多的排序/散列操作会转到磁盘上进行。此外,如果您必需要使用更多的RAM的话,则可以尝试减少shared_buffers参数值。进行此操作时必须十分谨慎,需要时刻观察缓冲区高速缓存命中率的统计信息。

4)在Linux 2.6及以上的版本中,可以修改内核的行为。尽管此设置不会阻止OOM killer被调用,但它可以显著地降低其可能性。

可以通过用sysctl选择严格的过量使用模式来实现:

sysctl -w vm.overcommit_memory=2

或者在/etc/sysctl.conf中设置一个等价项。可能还需要修改相关的设置参数:vm.overcommit_ratio,这个参数表示内存分配时的比例,只有当vm.overcommit_memory=2的时候才会生效。

By Kalath

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/87774443