Wie viele CPUs verwendet ein Docker-Container?

120

Nehmen wir an, ich führe einen Multiprozessor- Dienst in einem Docker-Container aus, der mehrere Prozesse erzeugt. Würde Docker alle / mehrere Kerne / CPUs des Hosts oder nur einen verwenden?

kev
quelle
11
Es dürfen so viele CPUs wie die cgroup verwendet werden. Was standardmäßig nicht beschränkt ist. Sehen --cpuset-cpusSie, ob Sie das ändern wollten.
Charles Duffy
3
(Ein Docker-Container besteht nur aus einer Reihe privater Namespaces. Da er keine CPUs emuliert, müsste er sich alle Mühe geben, um ihnen Einschränkungen aufzuerlegen. Linux-Kernel bieten Funktionen, um ein solches Auslaufen zu ermöglichen. auf eigene Faust, aber das muss immer noch explizit durchgeführt werden.
Charles Duffy
Wie wäre es mit Docker Toolbox unter Windows, das VirtualBox verwendet?
Egor Kraev

Antworten:

110

Wie Charles erwähnt, können standardmäßig alle verwendet werden, oder Sie können sie pro Container mithilfe des --cpuset-cpusParameters begrenzen .

docker run --cpuset-cpus="0-2" myapp:latest

Dies würde den Container auf 3 CPUs (0, 1 und 2) beschränken. Weitere Informationen finden Sie in den Docker-Ausführungsdokumenten .


Der bevorzugte Weg, um die CPU-Auslastung von Containern zu begrenzen, besteht in einem Bruchteil der CPUs:

docker run --cpus 2.5 myapp:latest

Das würde Ihren Container auf 2,5 Kerne auf dem Host beschränken.


Wenn Sie Docker in einer VM ausführen, einschließlich Docker für Mac, Docker für Windows und Docker-Computer, haben diese VMs ein CPU-Limit, das von Ihrem Laptop selbst getrennt ist. Docker wird innerhalb dieser VM ausgeführt und verwendet alle Ressourcen, die der VM selbst zugewiesen wurden. ZB mit Docker für Mac haben Sie folgendes Menü:

Docker für Mac Erweiterte Einstellungen

BMitch
quelle
Würden zwei Docker-Container, die auf derselben VM mit zwei CPUs ausgeführt werden, die Leistung beeinträchtigen, wenn beide Laichprozesse sind? Beide erzeugen also zwei Prozesse für insgesamt vier, wenn sich nur zwei CPUs auf der VM befinden?
CocoPuffs
@cocoPuffs Wenn Sie keine CPU-Grenzwerte angeben, ist dies dasselbe, als würden Sie diese Prozesse außerhalb eines Containers auf demselben Host ausführen. Durch Hinzufügen von CPU-Grenzwerten zu jedem Container kann verhindert werden, dass Prozesse in einem Container alle CPU-Ressourcen für sich selbst verwenden.
BMitch
7

Möglicherweise hat Ihre Host-VM standardmäßig nur einen Kern. Daher sollten Sie Ihre VM erhöhen CPU-zählen und dann verwenden --cpuset-CPUs Option Ihre Docker Kerne zu erhöhen. Sie können die Docker-Standard-VM mit dem folgenden Befehl entfernen und dann eine weitere VM mit optionaler CPU-Anzahl und Speichergröße erstellen :

docker-machine rm default
docker-machine create -d virtualbox --virtualbox-cpu-count=8 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default

Nach diesem Schritt können Sie die Anzahl der Kerne angeben, bevor Sie Ihr Image ausführen. Dieser Befehl verwendet 4 Kerne von insgesamt 8 Kernen.

docker run -it --cpuset-cpus="0-3" your_image_name

Anschließend können Sie mit diesem Befehl die Anzahl der verfügbaren Kerne in Ihrem Image überprüfen:

nproc
arcsin
quelle