Quoting Gary Ballantyne (gary.ballant...@haulashore.com): > On Fri, 1 Feb 2013 10:24:13 -0600 > Serge Hallyn <serge.hal...@canonical.com> wrote: > > > > > Did you actually test with a memory hog program? I just noticed there > > appears to be a bug in that if I > > > > d=/sys/fs/cgroup/memory/a > > mkdir $d > > echo 1 > $d/memory.use_hierarchy > > echo 5000 > $d/memory.limit_in_bytes > > mkdir $d/b > > > > then $d/b/memory.limit_in_bytes does not report the reduced limit. However > > whenI run a program which does char *c = malloc(10000) after doing > > echo $$ > $d/b/tasks > > > > then I get killed by OOM. > > > > -serge > > I tested with a large array in ipython. Though, from your example, it seems > I'm missing memory.use_hierarchy. > > In principle, it seems like I need something like: > > echo 1 > /sys/fs/cgroup/memory/lxc/memory.use_hierarchy > > But, I can't do that before the container is started (no lxc directory) or > after it is started (device busy). >
Yup, it looks like lxc ought to set that at startup. I can think of absolutely no cases where we would *not* want that done. Something like: Subject: [PATCH 1/1] Try to enable memory cgroup use_hierarchy option. The memory cgroup has a 'memory.use_hierarchy' which is initialized to 0. It needs to be set to 1 at our top level, that is /sys/fs/cgroup/memory/lxc/memory.use_hiararchy, before we create any containers. After the fact is too late. Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/cgroup.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c index 28f3474..0078eda 100644 --- a/src/lxc/cgroup.c +++ b/src/lxc/cgroup.c @@ -482,6 +482,43 @@ int try_to_move_cgname(char *cgparent, char *cgname) } /* + * The memory cgroup has a 'memory.use_hierarchy' which is initialized to + * 0. It needs to be set to 1 at our top level, that is + * /sys/fs/cgroup/memory/lxc/memory.use_hiararchy, before we create any + * containers. After the fact is too late. + */ +static int enable_hierarchy(char *path) +{ + char filepath[MAXPATHLEN]; + int ret; + FILE *f; + int len = strlen(path); + + if (strlen(path) < 7 || strcmp(&path[len-6], "memory") != 0) + return 0; + + ret = snprintf(filepath, MAXPATHLEN, "%s/memory.use_hierarchy"); + if (ret < 0 || ret >= MAXPATHLEN) { + SYSERROR("Failed creating memory hierarchy filepath name"); + return -1; + } + + f = fopen(filepath, "w"); + if (!f) { + /* kernel may not support this file - s'ok */ + WARN("Unable to open cgroup memory.use_hierarchy file"); + return 0; + } + + if (fprintf(f, "1") < 1) { + WARN("Unable to set hierarchy to true for memory cgroup"); + } + fclose(f); + + return 0; +} + +/* * create a cgroup for the container in a particular subsystem. */ static int lxc_one_cgroup_create(const char *name, @@ -510,6 +547,10 @@ static int lxc_one_cgroup_create(const char *name, SYSERROR("Failed creating pathname for cgroup parent (%d)\n", ret); return -1; } + + if (enable_hierarchy(cgparent)) + return -1; + ret = snprintf(cgname, MAXPATHLEN, "%s/%s", cgparent, name); if (ret < 0 || ret >= MAXPATHLEN) { SYSERROR("Failed creating pathname for cgroup (%d)\n", ret); -- 1.8.0 -serge ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_jan _______________________________________________ Lxc-users mailing list Lxc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-users