Ich möchte die Laufzeitleistungskosten eines Docker-Containers umfassend verstehen. Ich habe Hinweise darauf gefunden, dass das Netzwerk anekdotisch ~ 100µs langsamer ist .
Ich habe auch Hinweise darauf gefunden, dass die Laufzeitkosten "vernachlässigbar" und "nahe Null" sind, aber ich würde gerne genauer wissen, wie hoch diese Kosten sind. Im Idealfall möchte ich wissen, was Docker mit Leistungskosten abstrahiert und welche Dinge ohne Leistungskosten abstrahiert werden. Netzwerk, CPU, Speicher usw.
Wenn es Abstraktionskosten gibt, gibt es außerdem Möglichkeiten, die Abstraktionskosten zu umgehen. Zum Beispiel kann ich vielleicht eine Festplatte direkt oder virtuell in Docker mounten.
performance
docker
Luke Hoersten
quelle
quelle
Antworten:
Ein ausgezeichnetes IBM-Forschungspapier aus dem Jahr 2014 „ Ein aktualisierter Leistungsvergleich von virtuellen Maschinen und Linux-Containern “ von Felter et al. bietet einen Vergleich zwischen Bare-Metal-, KVM- und Docker-Containern. Das allgemeine Ergebnis ist: Docker ist nahezu identisch mit der nativen Leistung und in jeder Kategorie schneller als KVM.
Die Ausnahme hiervon ist Dockers NAT. Wenn Sie die Portzuordnung verwenden (z. B.
docker run -p 8080:8080
), können Sie mit einem geringfügigen Latenzverlust rechnen, wie unten gezeigt. Sie können jetzt jedoch den Host-Netzwerkstapel (z. B.docker run --net=host
) verwenden, wenn Sie einen Docker-Container starten, der mit der Native-Spalte identisch ist (wie in den Ergebnissen der Redis-Latenz weiter unten gezeigt).Sie führten auch Latenztests für einige bestimmte Dienste wie Redis durch. Sie können sehen, dass über 20 Client-Threads Docker NAT, dann KVM und dann eine grobe Verbindung zwischen Docker-Host / Native den höchsten Latenz-Overhead verursachen.
Nur weil es ein wirklich nützliches Papier ist, hier einige andere Zahlen. Bitte laden Sie es für den vollständigen Zugriff herunter.
Werfen Sie einen Blick auf Disk I / O:
Betrachten wir nun den CPU-Overhead:
Nun einige Beispiele für Speicher (lesen Sie das Papier für Details, Speicher kann besonders schwierig sein):
quelle
--net=host
(zwei Striche) und-p 8080:8080
(Kleinbuchstaben 'p') für NAT.Docker ist als solches keine Virtualisierung - stattdessen ist es eine Abstraktion zusätzlich zur Unterstützung des Kernels für verschiedene Prozessnamespaces, Gerätenamensräume usw.; Ein Namespace ist von Natur aus nicht teurer oder ineffizienter als ein anderer. Was Docker also tatsächlich zu einer Leistungsbeeinträchtigung bringt, hängt davon ab, was sich tatsächlich in diesen Namespaces befindet.
Die Auswahl von Docker in Bezug auf die Konfiguration von Namespaces für seine Container ist mit Kosten verbunden. Diese Kosten hängen jedoch alle direkt mit den Vorteilen zusammen. Sie können sie aufgeben. Dabei geben Sie jedoch auch den damit verbundenen Nutzen auf:
Und so weiter. Wie stark sich diese Kosten tatsächlich auf Sie in Ihrer Umgebung auswirken - mit Ihren Netzwerkzugriffsmustern, Ihren Speicherbeschränkungen usw. - ist ein Punkt, für den es schwierig ist, eine allgemeine Antwort zu geben.
quelle
Hier einige weitere Benchmarks für im
Docker based memcached server
Vergleich zuhost native memcached server
Twemperf Benchmark - Tool https://github.com/twitter/twemperf mit 5000 Anschlüssen und 20k VerbindungsrateDer Verbindungszeitaufwand für Docker-basiertes Memcached scheint mit dem obigen Whitepaper mit ungefähr der doppelten nativen Geschwindigkeit übereinzustimmen.
Twemperf Docker Memcached
Twemperf Centmin Mod Memcached
Hier sind die Bencmarks mit dem Memtier-Benchmark-Tool
memtier_benchmark docker Memcached
memtier_benchmark Centmin Mod Memcached
quelle
avg 200.5 min 0.6 max 263.2 stddev 73.85