我正在使用docker集装箱一堆服务。 有时候,集装箱化服务大量交换。 我已经通过我的主机系统上的sysctl将vm.swappiness
更改为1
。 但是docker的内存cgroup仍旧有60(默认)的值。因此,所有特定容器的cgroup与parent都有相同的值。
sysctl vm.swappiness > vm.swappiness = 1 cat /sys/fs/cgroup/memory/docker/memory.swappiness > 60 cat /sys/fs/cgroup/memory/docker/${CONTAINER_ID}/memory.swappiness > 60
所有尝试手动更改swappiness(通过将期望值回显到memory.swappiness
文件中)都会因permission denied
失败。
主题:我如何限制容器swappiness?
我使用内核3.13
ubuntu 12.04
,我的docker版本是1.1.2
使用0.2
版的本机执行驱动程序(不是lxc)。 内核加载了cgroup_enable=memory swapaccount=1
。
如果升级到3.18内核或更高版本, memory.swappiness
禁止修改子级/层级cgroup中cgroup memory.swappiness
参数的限制。 删除这个限制的Linux内核补丁可以在这里看到: https : //github.com/torvalds/linux/commit/3dae7fec5e884a4e72e5416db0894de66f586201
Docker 1.8很可能包含下面的PR( https://github.com/docker/docker/pull/14004 ),允许容器设置自己的memory.swappiness
值,允许用户控制这个cgroup设置,只要Docker守护进程主机内核有上面提到的补丁,或者主机内核是3.18或更高。
得到它了! Docker甚至不会触及这个参数。 memory.swappines
cgroups真的改变/proc/vm/swappiness
。 所有的孩子从父母继承这个价值。 Docker甚至不会触及这个参数。 而且,在某些情况下(和我自己一样)没有能力在memory.swappines
写一些东西。 如果内存cgroup使用层次结构或包含子级 ,则所有尝试将内容写入cgroups memory.swappiness
都将失败。
看这里。 这是从mm/memcontrol.c
。
static int mem_cgroup_swappiness_write(struct cgroup_subsys_state *css, struct cftype *cft, u64 val) { struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *parent = mem_cgroup_from_css(css_parent(&memcg->css)); if (val > 100 || !parent) return -EINVAL; mutex_lock(&memcg_create_mutex); /* If under hierarchy, only empty-root can set this value */ if ((parent->use_hierarchy) || memcg_has_children(memcg)) { mutex_unlock(&memcg_create_mutex); return -EINVAL; } memcg->swappiness = val; mutex_unlock(&memcg_create_mutex); return 0; }