我正在使用 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.13
的 ubuntu 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/