更改docker容器的swappiness

Via*_*lev 8 linux memory cgroups docker

我正在使用docker来容纳大量服务.有时,集装箱化服务大量交换.我已经改变了vm.swappiness1通过sysctl我的主机系统上.但是,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
Run Code Online (Sandbox Code Playgroud)

所有手动更改swappiness的尝试(通过将所需的值回显到memory.swappiness文件中)都失败了permission denied.

主题:如何限制容器swappiness?

我正在使用ubuntu 12.04内核3.13,我的docker版本是1.1.2本机执行驱动程序(不是lxc)的版本0.2.内核已加载cgroup_enable=memory swapaccount=1.

Via*_*lev 6

知道了!Docker 甚至没有触及这个参数。memory.swappines对于 cgroups 确实根据/proc/vm/swappiness. 所有孩子都从父母那里继承这个值。Docker 甚至没有触及这个参数。此外,在某些情况下(完全在我自己的情况下)没有能力在memory.swappines. 如果内存 cgroup 使用层次结构,或包含 children,则所有向 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;
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*l E 5

如果您升级到3.18内核或更高版本,memory.swappiness则会删除阻止修改子级/层次结构cgroup中的cgroup 参数的限制。可以在此处看到消除此限制的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或更高版本。