我正在使用docker来容纳大量服务。有时,集装箱化服务大量交换。我已通过主机系统上的sysctl将vm.swappiness
更改为1
。但是,docker的内存cgroup仍然具有旧的(默认)值60.因此,所有特定容器的cgroup具有与父级相同的值。
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?
我正在使用内核ubuntu 12.04
的{{1}},我的docker版本为3.13
,版本为1.1.2
的本机执行驱动程序(不是lxc)。内核加载了0.2
。
答案 0 :(得分:4)
如果升级到3.18内核或更高版本,则会删除阻止修改子/层次结构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或更高。
答案 1 :(得分:3)
知道了! Docker甚至没有触及此参数。对于cgroup,memory.swappines
确实根据/proc/vm/swappiness
进行了更改。所有子节点都从父节点继承此值。 Docker甚至没有触及此参数。而且,在某些情况下(完全在我自己的情况下),没有能力在memory.swappines
中写一些东西。 如果内存cgroup使用层次结构或包含子级,则所有向cgroup 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;
}