2014-09-10 4 views
6

나는 도커를 사용하여 서비스 묶음을 컨테이너화하고 있습니다. 때로는 컨테이너 서비스가 많이 교환됩니다. 제 호스트 시스템의 sysctl을 통해 vm.swappiness1으로 변경했습니다. 그러나 docker의 메모리 cgroup은 여전히 ​​오래된 (기본값) 값 60을 갖습니다. 따라서 모든 특정 컨테이너의 cgroup은 parent와 동일한 값을 갖습니다.도커 컨테이너 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 

모든 시도는 실패 permission denied (memory.swappiness 파일에 원하는 값으로 반향) swappiness 수동으로 변경한다.

제목 : 컨테이너 스왑을 어떻게 제한 할 수 있습니까? 나는 커널 3.13ubuntu 12.04 사용하고

내 고정 표시기 버전은 버전 0.2의 (LXC되지 않음)의 원시 실행 드라이버 1.1.2입니다. 커널은 cgroup_enable=memory swapaccount=1으로로드됩니다.

답변

2

알 수 있습니다. Docker는이 매개 변수를 건드리지 않습니다. /proc/vm/swappiness에 따라 실제로 변경되는 cgroup의 경우 memory.swappines입니다. 모든 자식은 부모로부터이 값을 상속받습니다. Docker는이 매개 변수를 건드리지 않습니다. 또한, 어떤 경우에는 (그리고 정확히 내 자신의) memory.swappines에 무엇인가 쓸 수있는 능력이 없습니다. 메모리 cgroup에서 계층 구조를 사용하거나 자식이 인 경우 cgroup memory.swappiness에 무언가를 쓰려는 모든 시도가 실패합니다.

거기를보십시오. 이것은 mm/memcontrol.c입니다. 당신이 나중에 3.18 커널 이상으로 업그레이드하는 경우

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

는, 아이/계층 구조 cgroup에있는 cgroup에 memory.swappiness 매개 변수 변경을 방지 제한이 없어집니다. 이 제한을 제거 리눅스 커널 패치는 여기에서 볼 수있다 : https://github.com/torvalds/linux/commit/3dae7fec5e884a4e72e5416db0894de66f586201

도커 1.8 거의 확실 컨테이너가이 cgroup에 설정을 통해 자신의 memory.swappiness 값을 허용하는 사용자 정의 컨트롤을 설정할 수 있습니다 (https://github.com/docker/docker/pull/14004) 한 다음 PR을 포함 Docker 데몬 호스트 커널에 위에서 언급 한 패치가 있거나 호스트 커널이 3.18 이상이기 때문입니다.