2016-07-24 2 views
3

Ich habe ein Problem mit der trägen Netzwerkleistung zwischen Docker-Containern und dem Netzwerk des Hosts. Ich habe diese Frage im Docker-Forum gestellt, aber bisher keine Antworten erhalten.Sehr geringe Netzwerkleistung von Docker-Containern mit dem Netzwerk des Hosts

Problem

Set-up: zwei Macs auf dem gleichen lokalen Netzwerk; der erste betreibt einen MQTT-Broker (mosquitto); Die zweite läuft Docker für Mac. Zwei C++ - Programme laufen auf dem zweiten Mac und tauschen Daten mehrfach über den MQTT-Broker (auf dem ersten Mac) unter Verwendung der Paho MQTT C-Bibliothek aus.

Nativer Lauf: Wenn ich die zwei C++ - Programme nativ lief, war die Netzwerkleistung wie erwartet ausgezeichnet. Die Programme wurden mit XCode 7.3 erstellt.

Docker läuft: Wenn ich eines der C++ - Programme oder beide in Docker ausgeführt habe, fiel die Netzwerkleistung dramatisch ab, etwa 30 mal langsamer als die native Ausführung. Das Docker-Image basiert auf ubuntu: neuste, und die Programme wurden von gcc (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.1) erstellt. 5.4.0 20160609.

Ich habe versucht, das Host-Netzwerk (--network = "host" in Docker run) aber es hat nicht geholfen. Ich habe auch versucht, den MQTT-Broker auf dem zweiten Mac auszuführen (so dass der Broker und die Container auf demselben Host ausgeführt wurden); Das Problem blieb bestehen. Das Problem bestand sowohl in meinem Arbeits-LAN als auch in meinem Heimnetzwerk.

In der Theorie könnte es sein, dass die C++ - Programme in Docker-Containern im Allgemeinen langsam waren. Aber ich bezweifle, dass dies der Fall war, denn nach meiner Erfahrung ist die allgemeine Leistung von C++ - Code in Docker ungefähr so ​​schnell wie in der nativen Umgebung.

Frage

Was könnte die Ursache für dieses Problem sein? Gibt es irgendwelche Einstellungen in Docker, die dieses Problem lösen können?

Antwort

0

Ich vermute, dass die Standardzuweisung von Speicher und CPU für die Container möglicherweise nicht optimal für die Art der Netzwerkleistung ist, die Sie erreichen möchten.

  1. die Nutzung von Ressourcen innerhalb des Behälters Untersuchung unter Verwendung von Standard-Tool wie oben, htop, strace usw. Oder Sie können Docker stat Befehl verwenden, wenn diese Instanzen in Spitzenbetrieb sind $ docker stats node1 node2 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O node1 0.07% 796 KB/64 MB 1.21% 788 B/648 B node2 0.07% 2.746 MB/64 MB 4.29% 1.266 KB/648 B
  2. Dann könnten Sie wollen Ändern Sie die verschiedenen Ressourcenzuweisungsparameter, die mit Docker Run verfügbar sind. enter image description here

    1. EDIT: Eine andere Sache wäre MTU der tatsächlichen Systemschnittstelle und die Einstellung auf die Docker Schnittstellen zu überprüfen sein. Verwenden Sie --mtu=BYTES MTU Ihre Docker Werte setzen Sie Ihre System-Schnittstelle der MTU-Wert auf Mac
+0

Danke für Ihre Antwort. Ich habe versucht, was du vorgeschlagen hast. Die CPU-Auslastung war sehr niedrig (0,3%), die Speicherbelegung betrug 4,4 MB bei 2 GB, die Gesamt-I/O über 500 KB/400 KB insgesamt über 35 Sekunden.Die Netto-I/O-Geschwindigkeit betrug daher nur 14 KB und 11 KB pro Sekunde, ungewöhnlich langsam auf modernen Computern und Netzwerken. Der native Lauf dauerte weniger als 1 Sekunde. Irgendein Vorschlag? – Truong

+0

@Truong Können Sie die MTU-Einstellungen überprüfen, wie ich sie in EDIT hinzugefügt habe? –

+0

Die MTU-Option existiert nicht auf Docker für Mac: https://docs.docker.com/docker-for-mac/networking/. Ich nehme an, die MTU wird standardmäßig auf den Host-Wert eingestellt (1500 in meinem Fall). – Truong

Verwandte Themen