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

Reply via email to