web-dev-qa-db-fra.com

Comment Docker utilise-t-il les cœurs de processeur de son système d'exploitation hôte?

Ma compréhension, basée sur le fait que Docker est basé sur LXC, est que les conteneurs Docker partagent diverses ressources de son système d'exploitation hôte. Ma préoccupation concerne les cœurs de processeur. Voici un scénario:

  • un OS Linux hôte a 8 cœurs
  • Je dois déployer un ensemble de conteneurs Docker sur le système d'exploitation hôte ci-dessus.
  • Certains des conteneurs Docker que je dois déployer seraient mieux adaptés pour utiliser 2 cœurs

a) Donc, si j'exécute tous les conteneurs de docker sur cet hôte, consommera-t-il le processeur/les cœurs au besoin, comme s'ils étaient exécutés en tant qu'applications installées normales sur ce système d'exploitation hôte?

b) Le conteneur Docker consommera-t-il son propre processus et tout le traitement qui y est contenu sera-t-il collé au cœur de processeur du processus parent?

c) Comment puis-je spécifier un conteneur Docker pour utiliser un certain nombre de cœurs (4 par exemple). J'ai vu qu'il y a un drapeau -C qui peut pointer vers un identifiant de cœur, mais il semble qu'il n'y ait pas d'option pour spécifier le conteneur pour choisir N ​​cœurs au hasard.

41
gextra

Actuellement, je ne pense pas que Docker offre ce niveau de granularité. Il ne spécifie pas combien de cœurs il alloue dans ses fichiers lxc.conf, donc vous obtiendrez potentiellement tous les cœurs pour chaque docker (ou peut-être 1, je ne suis pas sûr à 100% à ce sujet).

Cependant, vous pouvez modifier le fichier conf généré pour un conteneur donné et définir quelque chose comme

cpuset {
    cpuset.cpus="0-3";
}
7
Oliver Matthews

Il se pourrait que les choses aient changé dans les dernières (quelques) versions. De nos jours, vous pouvez contraindre votre conteneur Docker avec des paramètres pour docker run: L'équivalent de la réponse actuelle dans la nouvelle version de docker est docker run ubuntu /bin/echo 'Hello world --cpuset-cpus="0-3" Cependant, cela limitera le processus de docker à ces CPU, mais (veuillez me corriger si je me trompe), d'autres conteneurs pourraient également demander le même ensemble. Une meilleure façon possible serait d'utiliser des partages CPU.

Pour plus d'informations, voir https://docs.docker.com/engine/reference/run/

6
DragonTux

De la documentation Oracle:

  To control a container's CPU usage, you can use the
  --cpu-period  and --cpu-quota options with the docker 
  create and docker run commands  from version 1.7.0 of Docker onward.

  The --cpu-quota option specifies the number of microseconds 
  that a container has access to CPU resources during a 
  period specified by --cpu-period.
  As the default value of --cpu-period is 100000, setting the 
  value of --cpu-quota to 25000 limits a container to 25% of 
  the CPU resources. By default, a container can use all available CPU resources, 
  which corresponds to a --cpu-quota value of -1.
4
Ijaz Ahmad Khan

Donc, si j'exécute tous les conteneurs Docker sur cet hôte, consommera-t-il le CPU/les cœurs selon les besoins, comme s'ils étaient exécutés en tant qu'applications installées normales sur ce système d'exploitation hôte?

Oui.

CPU

Par défaut, l'accès de chaque conteneur aux cycles de processeur de la machine hôte est illimité. Vous pouvez définir diverses contraintes pour limiter l'accès d'un conteneur donné aux cycles de processeur de la machine hôte.


Le conteneur Docker consommera-t-il son propre processus et tout le traitement qu'il contient sera-t-il collé au cœur de processeur de ce processus parent?

Nan.

Docker utilise Completely Fair Scheduler pour partager les ressources CPU entre les conteneurs. Les conteneurs ont donc un accès configurable au CPU.


Comment puis-je spécifier un conteneur Docker pour utiliser un certain nombre de cœurs (4 par exemple). J'ai vu qu'il y a un drapeau -C qui peut pointer vers un identifiant de cœur, mais il semble qu'il n'y ait pas d'option pour spécifier le conteneur pour choisir N ​​cœurs au hasard.

Il est plus deconfigurable. Il existe d'autres options de processeur dans Docker que vous pouvez combiner.

--cpus = Spécifiez la quantité de ressources CPU disponibles qu'un conteneur peut utiliser. Par exemple, si la machine hôte possède deux CPU et que vous définissez --cpus = "1.5", le conteneur est garanti au maximum un et demi des CPU.

--cpuset-cpus Limitez les processeurs ou cœurs spécifiques qu'un conteneur peut utiliser. Une liste séparée par des virgules ou une plage de processeurs séparés par des tirets qu'un conteneur peut utiliser si vous avez plusieurs processeurs. Le premier processeur est numéroté 0. Une valeur valide peut être 0 pour utiliser le premier, le deuxième, le troisième et le quatrième processeur) ou 1,3 (pour utiliser le deuxième et le quatrième processeur).

--- (Et plus ...

2
I159