Modifier le swappiness pour docker container

J’utilise docker pour conteneuriser des tas de services. Parfois, les services conteneurisés échangent beaucoup. J’ai changé vm.swappiness à 1 via sysctl sur mon système hôte. Mais le groupe de contrôle de la mémoire de docker a toujours une ancienne valeur (par défaut) de 60. Par conséquent, tous les groupes de contrôle de conteneurs particuliers ont la même valeur, en tant que parent.

 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 

Toute tentative de modification manuelle de la permutation (en faisant écho à la valeur souhaitée dans le fichier memory.swappiness ) échoue avec l’ permission denied .

Objet: Comment puis-je limiter la permutation des conteneurs?

J’utilise ubuntu 12.04 avec le kernel 3.13 , ma version de docker est 1.1.2 avec le pilote d’exécution natif (pas lxc) de la version 0.2 . Le kernel est chargé avec cgroup_enable=memory swapaccount=1 .

Si vous effectuez une mise à niveau vers un kernel 3.18 ou ultérieur, la ressortingction empêchant la modification du paramètre cgroup memory.swappiness dans les memory.swappiness enfant / hiérarchie est supprimée. Le correctif du kernel Linux qui a supprimé cette ressortingction peut être vu ici: https://github.com/torvalds/linux/commit/3dae7fec5e884a4e72e5416db0894de66f586201

Docker 1.8 inclura probablement le PR suivant ( https://github.com/docker/docker/pull/14004 ) qui permet au conteneur de définir sa propre valeur memory.swappiness permettant à l’utilisateur de contrôler ce paramètre de groupe de contrôle, à condition que le Le correctif indiqué dans le kernel hôte du démon Docker ou le kernel hôte est 3.18 ou supérieur.

Je l’ai! Docker ne touche même pas ce paramètre. memory.swappines pour les memory.swappines de memory.swappines changeant vraiment en fonction de /proc/vm/swappiness . Tous les enfants héritent de cette valeur du parent. Docker ne touche même pas ce paramètre. De plus, dans certains cas (et exactement dans le mien), il n’est pas possible d’écrire quelque chose dans memory.swappines . Si la mémoire cgroup utilise la hiérarchie ou contient des enfants , toutes les tentatives d’écrire quelque chose dans cgroups memory.swappiness échoueront.

Regardez là. C’est à partir de 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; }