[sheepdog] [PATCH v2] sheep:avoid the OOM killer

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Fri Jul 5 07:46:52 CEST 2013


Because sheep provides virtual disks to many VMs, sheep is an
important process and it shouldn't be killed by the OOM killer of
Linux. This patch implements a mechanism for avoiding the OOM killer.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---

v2:
 - remove the meaningless comment
 - add a description for the value -1000

 sheep/sheep.c |   33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/sheep/sheep.c b/sheep/sheep.c
index 84bd269..335edb4 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -371,6 +371,35 @@ static int create_work_queues(void)
 	return 0;
 }
 
+static int avoid_oom_killer(void)
+{
+	int fd, ret = 0;
+	char path[PATH_MAX];
+
+	snprintf(path, PATH_MAX, "/proc/%d/oom_score_adj", getpid());
+	fd = open(path, O_WRONLY);
+	if (fd < 0) {
+		sd_iprintf("opening %s failed, %m", path);
+		ret = -1;
+		goto end;
+	}
+
+	/*
+	 * -1000 is defined as OOM_SCORE_ADJ_MIN in the linux kernel. And
+	 * processes which wrote OOM_SCORE_ADJ_MIN to
+	 * /proc/<their pid>/oom_score_adj are excluded by the target list of
+	 * the OOM killer certainly.
+	 */
+	if (xwrite(fd, "-1000\n", 6) != 6) {
+		sd_iprintf("writing to %s failed, %m", path);
+		ret = -1;
+	}
+
+	close(fd);
+end:
+	return ret;
+}
+
 /*
  * FIXME: Teach sheep handle EMFILE gracefully.
  *
@@ -419,6 +448,10 @@ static void check_host_env(void)
 	 * sized request.
 	 */
 	mallopt(M_MMAP_THRESHOLD, 512 * 1024);
+
+	if (avoid_oom_killer() < 0)
+		sd_eprintf("WARN: adjusting OOM failed, this process has a"
+			" possibility of being killed by the OOM killer");
 }
 
 static int lock_and_daemon(bool daemonize, const char *base_dir)
-- 
1.7.10.4




More information about the sheepdog mailing list