8

我正在使用 docker 容器化一堆服务。有时,容器化服务会大量交换。我已在主机系统上更改vm.swappiness为via sysctl。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.

主题:如何限制容器交换?

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

4

2 回答 2

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;
}
于 2014-09-12T22:37:44.150 回答
5

如果升级到 3.18 或更高版本的内核,则阻止修改memory.swappiness子级/层次结构 cgroups 中的 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 或更高版本。

于 2015-07-08T19:34:18.607 回答