As a failsafe we may want to put a hard limit on memory.limit_in_bytes and memory.memsw.limit_in_bytes when using cgroups. This patch adds MaxRAMPercent and MaxSwapPercent which are taken as percentages of available RAM (RealMemory as reported by slurmd), and which will be applied as upper bounds when creating memory controller cgroups. --- src/common/xcgroup_read_config.c | 14 ++++++++++++++ src/common/xcgroup_read_config.h | 2 ++ 2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/src/common/xcgroup_read_config.c b/src/common/xcgroup_read_config.c index ef2397d..41386c9 100644 --- a/src/common/xcgroup_read_config.c +++ b/src/common/xcgroup_read_config.c @@ -82,8 +82,10 @@ static void _clear_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) slurm_cgroup_conf->task_affinity = false ; slurm_cgroup_conf->constrain_ram_space = false ; slurm_cgroup_conf->allowed_ram_space = 100 ; + slurm_cgroup_conf->max_ram_percent = 100 ; slurm_cgroup_conf->constrain_swap_space = false ; slurm_cgroup_conf->allowed_swap_space = 0 ; + slurm_cgroup_conf->max_swap_percent = 100 ; slurm_cgroup_conf->memlimit_enforcement = 0 ; slurm_cgroup_conf->memlimit_threshold = 100 ; slurm_cgroup_conf->constrain_devices = false ; @@ -107,8 +109,10 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) {"TaskAffinity", S_P_BOOLEAN}, {"ConstrainRAMSpace", S_P_BOOLEAN}, {"AllowedRAMSpace", S_P_UINT32}, + {"MaxRAMPercent", S_P_UINT32}, {"ConstrainSwapSpace", S_P_BOOLEAN}, {"AllowedSwapSpace", S_P_UINT32}, + {"MaxSwapPercent", S_P_UINT32}, {"ConstrainCores", S_P_BOOLEAN}, {"MemoryLimitEnforcement", S_P_BOOLEAN}, {"MemoryLimitThreshold", S_P_UINT32}, @@ -179,6 +183,16 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf) "AllowedSwapSpace", tbl)) slurm_cgroup_conf->allowed_swap_space = 0; + if (s_p_get_uint32(&slurm_cgroup_conf->max_ram_percent, + "MaxRAMPercent", tbl) + && (slurm_cgroup_conf->max_ram_percent > 100)) + fatal ("%s: Invalid MaxRAMPercent\n", conf_path); + + if (s_p_get_uint32(&slurm_cgroup_conf->max_swap_percent, + "MaxSwapPercent", tbl) + && (slurm_cgroup_conf->max_swap_percent > 100)) + fatal ("%s: Invalid MaxSwapPercent\n", conf_path); + /* Memory limits */ if (!s_p_get_boolean(&slurm_cgroup_conf->memlimit_enforcement, "MemoryLimitEnforcement", tbl)) diff --git a/src/common/xcgroup_read_config.h b/src/common/xcgroup_read_config.h index bdbe472..032129b 100644 --- a/src/common/xcgroup_read_config.h +++ b/src/common/xcgroup_read_config.h @@ -64,9 +64,11 @@ typedef struct slurm_cgroup_conf { bool constrain_ram_space; uint32_t allowed_ram_space; + uint32_t max_ram_percent; /* Upper bound on memory as % of RAM*/ bool constrain_swap_space; uint32_t allowed_swap_space; + uint32_t max_swap_percent; /* Upper bound on swap as % of RAM */ bool memlimit_enforcement; uint32_t memlimit_threshold; -- 1.7.1