1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

Add some simple support and documentation for using process-specific oom_adj

settings to prevent the postmaster from being OOM-killed on Linux systems.

Alex Hunsaker and Tom Lane
This commit is contained in:
Tom Lane
2010-01-11 18:39:32 +00:00
parent 292176a118
commit d5e0029862
3 changed files with 74 additions and 9 deletions

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.429 2009/12/10 06:32:28 petere Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.430 2010/01/11 18:39:32 tgl Exp $ -->
<chapter Id="runtime">
<title>Server Setup and Operation</title>
@ -1244,7 +1244,7 @@ default:\
this (consult your system documentation and configuration on where
to look for such a message):
<programlisting>
Out of Memory: Killed process 12345 (postgres).
Out of Memory: Killed process 12345 (postgres).
</programlisting>
This indicates that the <filename>postgres</filename> process
has been terminated due to memory pressure.
@ -1258,13 +1258,13 @@ Out of Memory: Killed process 12345 (postgres).
<productname>PostgreSQL</productname> on a machine where you can
be sure that other processes will not run the machine out of
memory. If memory is tight, increasing the swap space of the
operating system can help avoiding the problem, because the
out-of-memory (OOM) killer is invoked whenever physical memory and
operating system can help avoid the problem, because the
out-of-memory (OOM) killer is invoked only when physical memory and
swap space are exhausted.
</para>
<para>
On Linux 2.6 and later, an additional measure is to modify the
On Linux 2.6 and later, it is possible to modify the
kernel's behavior so that it will not <quote>overcommit</> memory.
Although this setting will not prevent the <ulink
url="http://lwn.net/Articles/104179/">OOM killer</> from being invoked
@ -1275,11 +1275,31 @@ Out of Memory: Killed process 12345 (postgres).
sysctl -w vm.overcommit_memory=2
</programlisting>
or placing an equivalent entry in <filename>/etc/sysctl.conf</>.
You might also wish to modify the related setting
<literal>vm.overcommit_ratio</>. For details see the kernel documentation
You might also wish to modify the related setting
<varname>vm.overcommit_ratio</>. For details see the kernel documentation
file <filename>Documentation/vm/overcommit-accounting</>.
</para>
<para>
Another approach, which can be used with or without altering
<varname>vm.overcommit_memory</>, is to set the process-specific
<varname>oom_adj</> value for the postmaster process to <literal>-17</>,
thereby guaranteeing it will not be targeted by the OOM killer. The
simplest way to do this is to execute
<programlisting>
echo -17 > /proc/self/oom_adj
</programlisting>
in the postmaster's startup script just before invoking the postmaster.
Note that this action must be done as root, or it will have no effect;
so a root-owned startup script is the easiest place to do it. If you
do this, you may also wish to build <productname>PostgreSQL</>
with <literal>-DLINUX_OOM_ADJ=0</> added to <varname>CFLAGS</>.
That will cause postmaster child processes to run with the normal
<varname>oom_adj</> value of zero, so that the OOM killer can still
target them at need.
</para>
<note>
<para>
Some vendors' Linux 2.4 kernels are reported to have early versions
of the 2.6 overcommit <command>sysctl</command> parameter. However, setting
@ -1294,6 +1314,7 @@ sysctl -w vm.overcommit_memory=2
feature is there. If in any doubt, consult a kernel expert or your
kernel vendor.
</para>
</note>
</sect2>
</sect1>