[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