L'un de mes conteneurs est toujours occupé et enlève le processeur des autres conteneurs (serveurs Web) qui doivent être réactifs et ne sont actifs que de temps en temps.

Je voudrais réduire la priorité du processeur du conteneur consommateur de processeur, de sorte que chaque fois que les autres conteneurs ont besoin du processeur, il ne soit pas obstrué.

Comment puis-je faire cela? Je cherche sur le Web depuis un certain temps maintenant, mais je ne trouve pas la réponse.

J'ai essayé d'exécuter le conteneur avec --entrypoint='nice 10 mybinary', mais il s'avère que --entrypoint ne peut exécuter que des binaires, pas des commandes shell.

5
kovan 27 janv. 2019 à 22:56

3 réponses

Meilleure réponse

Vous pouvez limiter les ressources du processeur au niveau du conteneur. Je recommande d'utiliser --cpu-shares 512 pour votre cas.

https://docs.docker.com/config/containers/resource_constraints/:

Définissez cet indicateur sur une valeur supérieure ou inférieure à la valeur par défaut de 1024 pour augmenter ou réduire le poids du conteneur et lui donner accès à une proportion plus ou moins grande des cycles de processeur de la machine hôte. Ceci n'est appliqué que lorsque les cycles du processeur sont limités. Lorsque de nombreux cycles CPU sont disponibles, tous les conteneurs utilisent autant de CPU qu'ils en ont besoin. De cette façon, il s'agit d'une limite souple. --cpu-partages n'empêche pas la planification des conteneurs en mode essaim. Il donne la priorité aux ressources CPU du conteneur pour les cycles CPU disponibles. Il ne garantit ni ne réserve aucun accès spécifique au processeur.

6
Jan Garaj 27 janv. 2019 à 20:18

--cpu-shares semble être une bonne réponse, même si je ne sais pas comment vérifier que cela fonctionne. Je suis également curieux de savoir quelle est la valeur maximale? Le document ne le dit pas.

Mais, comme alternative aux conteneurs de confiance, ce même document affiche également {{X0 }} qui permettra de changer les priorités de processus dans un conteneur. c'est-à-dire que si la commande nice ou renice est disponible dans le conteneur, elle devrait fonctionner lorsque vous ajoutez la capacité sys_nice. Vous ne voudrez autoriser cette fonctionnalité que pour les conteneurs approuvés, car vous ne voulez pas que les programmes non approuvés changent leurs propres priorités bon gré mal gré.

Vous pouvez vérifier en inspectant la colonne NI pour le processus en question en utilisant top ou ps -efl sur l'hôte.

0
acker9 26 juil. 2019 à 18:13

La définition des partages de CPU est la réponse la plus directe à votre demande, et généralement préférée à l'ajout de capacités au conteneur pourrait être utilisée par un acteur malveillant à l'intérieur du conteneur pour affecter l'hôte. La seule raison pour laquelle je peux penser pour ajouter la capacité SYS_NICE au conteneur est si vous avez plusieurs processus à l'intérieur du conteneur et que vous souhaitez leur donner des priorités différentes, ou devez changer la priorité pendant que le conteneur est en cours d'exécution.

La solution la plus traditionnelle pour les voisins bruyants est de configurer chaque conteneur avec une limite sur la quantité de CPU et de mémoire qu'il est autorisé à utiliser. Il s'agit d'une limite supérieure, alors sachez qu'il peut y avoir des ressources CPU inactives si vous définissez ce niveau bas et que vous n'avez aucune autre tâche disponible pour le CPU à exécuter.

Le moyen le plus simple de définir la limite des conteneurs à partir de la ligne de commande docker run est d'utiliser --cpus qui vous permet de configurer un nombre fractionnaire de cœurs pour être disponible pour le conteneur. Passer une option comme --cpus 2.5 permet au conteneur d'utiliser jusqu'à 2,5 cœurs avant que le planificateur du noyau ne ralentisse le processus. Si vous aviez un hôte à 4 cœurs, cela garantirait qu'au moins 1,5 cœurs sont toujours disponibles pour les autres processus.

En lien avec ces limites, avec le mode Swarm, vous pouvez également configurer une réservation pour le processeur (et la mémoire). La réservation est une limite inférieure dont Docker garantit qu'elle n'a été réservée à aucun autre conteneur. Ceci est utilisé pour sélectionner des nœuds pour planifier des conteneurs et peut empêcher la planification de certains conteneurs lorsqu'il n'y a pas suffisamment de ressources disponibles, plutôt que de planifier autant de travaux sur un seul nœud qu'il échoue.

1
BMitch 26 juil. 2019 à 18:35