更改docker容器的swappiness

时间:2014-09-10 13:51:13

标签: linux memory docker cgroups

我正在使用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

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;
}