linux - 更改 docker 容器的 swappiness

标签 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

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

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

最佳答案

知道了! Docker 甚至没有触及这个参数。 memory.swappines 用于真正根据 /proc/vm/swappiness 变化的 cgroup。所有子级都从父级继承此值。 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;
}

关于linux - 更改 docker 容器的 swappiness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767224/

相关文章:

windows - sbt 在运行 Play docker 容器时下载失败

docker - 如何在 Docker Compose 中使用卷在主机和容器之间共享数据

linux - 按小时计算行数

c++ - exclude/usr/include/c++/4.3/in用intel编译器编译代码

regex - 在 shell 中使用 grep 时,PCRE 正则表达式似乎不起作用

c# - 如何在 C# 中播放声音?

iOS:从网络下载超大数据的策略

memory - 分配如何工作以及如何防止分配?

docker - Dockerfile 中的 VOLUME 是否在 kubernetes 中持久存在

c++ - 如何将程序输出重定向为输入