2014-09-10 60 views
6

我正在使用docker來容納一堆服務。有時候,集裝箱化的服務大量交換。我通過我的主機系統上的sysctl將vm.swappiness更改爲1。但是docker的內存cgroup仍舊有60(默認)值。因此,所有特定容器的cgroup都具有與父級相同的值。更改Docker容器的swappiness

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內核3.13,我的碼頭工人的版本是1.1.2與本地執行的驅動程序(不LXC)的0.2版本。內核加載了cgroup_enable=memory swapaccount=1

回答

2

Got it! Docker甚至沒有觸及這個參數。 memory.swappines爲cgroups真正改變根據/proc/vm/swappiness。所有的孩子從父母繼承這個值。 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; 
} 
3

如果升級到3.18內核或更高版本,限制防止修改該cgroup memory.swappiness參數子/層級的cgroup被刪除。其中移除了這個限制了Linux內核補丁可以在這裏看到:https://github.com/torvalds/linux/commit/3dae7fec5e884a4e72e5416db0894de66f586201

泊塢窗1.8很可能會包括以下PR(https://github.com/docker/docker/pull/14004),它允許容器在這個cgroup中設置中設置自己的memory.swappiness值允許用戶控制,只要因爲Docker守護進程主機內核具有上述補丁,或者主機內核爲3.18或更高。

相關問題