From f23425fa950fec3aff458de117037c9caadbc35c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 1 Jul 2014 17:23:16 -0400
Subject: [PATCH] Improve handling of OOM score adjustment in sample Linux
 start script.

Per a suggestion from Christoph Berg.
---
 contrib/start-scripts/linux | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/contrib/start-scripts/linux b/contrib/start-scripts/linux
index bab8b0efc67..2dff0094cd3 100644
--- a/contrib/start-scripts/linux
+++ b/contrib/start-scripts/linux
@@ -42,18 +42,17 @@ PGLOG="$PGDATA/serverlog"
 
 # It's often a good idea to protect the postmaster from being killed by the
 # OOM killer (which will tend to preferentially kill the postmaster because
-# of the way it accounts for shared memory).  Setting the OOM_SCORE_ADJ value
-# to -1000 will disable OOM kill altogether, which is a good thing for the
-# postmaster, but not so much for individual backends.  If you enable this,
-# also uncomment the DAEMON_ENV line, which will instruct backends to set
-# their OOM adjustments back to the default setting of zero.
-#OOM_SCORE_ADJ=-1000
-#DAEMON_ENV="PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj"
+# of the way it accounts for shared memory).  To do that, uncomment these
+# three lines:
+#PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
+#PG_MASTER_OOM_SCORE_ADJ=-1000
+#PG_CHILD_OOM_SCORE_ADJ=0
 # Older Linux kernels may not have /proc/self/oom_score_adj, but instead
-# /proc/self/oom_adj, which works similarly except the disable value is -17.
-# For such a system, uncomment these two lines instead.
-#OOM_ADJ=-17
-#DAEMON_ENV="PG_OOM_ADJUST_FILE=/proc/self/oom_adj"
+# /proc/self/oom_adj, which works similarly except for having a different
+# range of scores.  For such a system, uncomment these three lines instead:
+#PG_OOM_ADJUST_FILE=/proc/self/oom_adj
+#PG_MASTER_OOM_SCORE_ADJ=-17
+#PG_CHILD_OOM_SCORE_ADJ=0
 
 ## STOP EDITING HERE
 
@@ -80,13 +79,19 @@ test -x $DAEMON ||
 	fi
 }
 
+# If we want to tell child processes to adjust their OOM scores, set up the
+# necessary environment variables.  Can't just export them through the "su".
+if [ -e "$PG_OOM_ADJUST_FILE" -a -n "PG_CHILD_OOM_SCORE_ADJ" ]
+then
+	DAEMON_ENV="PG_OOM_ADJUST_FILE=$PG_OOM_ADJUST_FILE PG_OOM_ADJUST_VALUE=$PG_CHILD_OOM_SCORE_ADJ"
+fi
+
 
 # Parse command line parameters.
 case $1 in
   start)
 	echo -n "Starting PostgreSQL: "
-	test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
-	test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
+	test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE"
 	su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
 	echo "ok"
 	;;
@@ -98,8 +103,7 @@ case $1 in
   restart)
 	echo -n "Restarting PostgreSQL: "
 	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
-	test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
-	test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
+	test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE"
 	su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
 	echo "ok"
 	;;
-- 
GitLab