summaryrefslogtreecommitdiffstats
path: root/postgresql-oom-adj.patch
diff options
context:
space:
mode:
authorTom Lane <tgl@fedoraproject.org>2010-01-11 18:11:25 +0000
committerTom Lane <tgl@fedoraproject.org>2010-01-11 18:11:25 +0000
commit8c0b3110102786ff58b48b8739da6068b5348d80 (patch)
tree9264a08efbcd1ea69bd43feed5fe944415239cd9 /postgresql-oom-adj.patch
parent2a1cdc60c9ab67af8f7240a71c6c6edeeb174e99 (diff)
downloadpostgresql-setup-8c0b3110102786ff58b48b8739da6068b5348d80.tar.gz
postgresql-setup-8c0b3110102786ff58b48b8739da6068b5348d80.tar.xz
postgresql-setup-8c0b3110102786ff58b48b8739da6068b5348d80.zip
Work around unintelligent kernel OOM-kill algorithm.postgresql-8_4_2-4_fc13
Diffstat (limited to 'postgresql-oom-adj.patch')
-rw-r--r--postgresql-oom-adj.patch57
1 files changed, 57 insertions, 0 deletions
diff --git a/postgresql-oom-adj.patch b/postgresql-oom-adj.patch
new file mode 100644
index 0000000..4ac05e6
--- /dev/null
+++ b/postgresql-oom-adj.patch
@@ -0,0 +1,57 @@
+Back-ported patch from Postgres devel head: reset oom_adj to zero in any
+postmaster child process. This allows us to disable OOM kill on the postmaster
+(see the init script) without affecting OOM behavior for child processes.
+
+
+diff -Naur postgresql-8.4.2.orig/src/backend/postmaster/fork_process.c postgresql-8.4.2/src/backend/postmaster/fork_process.c
+--- postgresql-8.4.2.orig/src/backend/postmaster/fork_process.c 2009-01-01 12:23:46.000000000 -0500
++++ postgresql-8.4.2/src/backend/postmaster/fork_process.c 2010-01-11 12:28:17.000000000 -0500
+@@ -12,7 +12,9 @@
+ #include "postgres.h"
+ #include "postmaster/fork_process.h"
+
++#include <fcntl.h>
+ #include <time.h>
++#include <sys/stat.h>
+ #include <sys/time.h>
+ #include <unistd.h>
+
+@@ -60,6 +62,38 @@
+ setitimer(ITIMER_PROF, &prof_itimer, NULL);
+ #endif
+
++ /*
++ * By default, Linux tends to kill the postmaster in out-of-memory
++ * situations, because it blames the postmaster for the sum of child
++ * process sizes *including shared memory*. (This is unbelievably
++ * stupid, but the kernel hackers seem uninterested in improving it.)
++ * Therefore it's often a good idea to protect the postmaster by
++ * setting its oom_adj value negative (which has to be done in a
++ * root-owned startup script). If you just do that much, all child
++ * processes will also be protected against OOM kill, which might not
++ * be desirable. You can then choose to build with LINUX_OOM_ADJ
++ * #defined to 0, or some other value that you want child processes
++ * to adopt here.
++ */
++#ifdef LINUX_OOM_ADJ
++ {
++ /*
++ * Use open() not stdio, to ensure we control the open flags.
++ * Some Linux security environments reject anything but O_WRONLY.
++ */
++ int fd = open("/proc/self/oom_adj", O_WRONLY, 0);
++
++ /* We ignore all errors */
++ if (fd >= 0)
++ {
++ char buf[16];
++
++ snprintf(buf, sizeof(buf), "%d\n", LINUX_OOM_ADJ);
++ (void) write(fd, buf, strlen(buf));
++ close(fd);
++ }
++ }
++#endif /* LINUX_OOM_ADJ */
+ }
+
+ return result;