100 Docker Container gegen 100 kleine Maschinen

8

Wir haben also eine Anwendung, die nicht threadsicher ist. Einige der Bibliotheken, die es verwendet, machen eine Sperre auf Dateisystemebene. Leider funktioniert es nicht richtig und wird abstürzen und einen Fehler ausgeben, wenn die Bibliothek gleichzeitig genutzt wird. Wir können diese Bibliothek auch nicht wechseln. Um Nebenläufigkeit zu erreichen, welche ist besser? 100 Behälter in einer leistungsstarken Maschine laufen lassen oder in 100 kleine Maschinen aufteilen?

Da wir Amazon verwenden, denke ich über 100 x t2.micro-Instanzen nach, die jeweils einen Container ausführen, wobei ein c4.8x großer Rechner mit 100 Dockercontainern ausgeführt wird. Wir haben kein Problem mit der Erinnerung. Die Aufgaben sind CPU-gebunden. Aber es ist auch nicht so schwer, dass eine t2.micro-Instanz genug ist, um damit umzugehen, solange es nur eins auf einmal verarbeitet.

Ich habe mich mit einem Kollegen darüber unterhalten, welcher besser ist. Ich bevorzuge die 100 Instanzen, weil ich denke, dass die Docker-Isolation einen erheblichen Overhead darstellt. Es ist, als ob Sie nur eine Ressource haben, aber es ist in 100 Personen aufgeteilt, die die Ressource verwenden müssen. Auf der anderen Seite macht mein Kollege einen Punkt, der meiner Meinung nach gültig sein könnte. Das Erstellen eines Linux-Namespace ist leichter als das Starten eines ganzen Betriebssystems. Wenn wir also 100 Maschinen haben, haben wir 100 OS, während wir bei einer großen Maschine nur ein OS haben.

Die Sache ist, ich weiß nicht, welcher der richtige ist. Könnte jemand, der darin Wissen hat, erklären, welches besser wäre und mir einen konkreten Grund geben?

Da mir klar geworden ist, dass ich gerade eine schlechte Frage gestellt habe, werde ich versuchen, hier weitere Informationen hinzuzufügen. Um die Frage präziser zu machen, frage ich nicht wirklich, welche in meinem speziellen Anwendungsfall besser ist oder welche billiger ist. Es ist nur eine Kuriosität, dass man in Bezug auf CPU besser arbeiten wird. Stellen Sie sich vor, wir haben ein sehr großes Berechnungsproblem, und wir müssen 100 davon machen. Wir wollen sie parallelisieren, aber sie sind nicht Thread-sicher. Ist es besser, sie in 100 kleinen Maschinen oder 1 leistungsstarken Maschinen mit 100 Behältern zu machen? Welche wird schneller abgeschlossen und warum?

Wenn wir nur 1 leistungsstarke Maschinen haben, werden all diese 100 Container nicht um Ressourcen kämpfen und den gesamten Prozess verlangsamen? Und wenn es 100 kleine Maschinen sind, wird die Gesamtleistung aufgrund der Betriebssysteme oder anderer Faktoren möglicherweise langsamer sein? Jedenfalls habe ich damit keine Erfahrung. Natürlich könnte ich das versuchen, aber am Ende, da es nicht die ideale Umgebung ist (mit vielen Faktoren), wird das Ergebnis sowieso nicht autorisierend sein. Ich war auf der Suche nach einer Antwort von Leuten, die wissen, wie beide Dinge auf niedrigem Niveau funktionieren und argumentieren könnten, welche Umgebung die Aufgabe schneller erledigen würde.

    
Rowanto 11.02.2016, 17:05
quelle

3 Antworten

11

Die einzige "passende" Antwort auf Ihre Frage ist: Sie müssen beide Optionen testen und herausfinden, welche besser ist. Der Grund dafür ist: Sie führen eine sehr spezifische Anwendung mit einer sehr spezifischen Arbeitslast und sehr spezifischen Anforderungen. Jede Empfehlung ohne tatsächliche Tests ist eine Vermutung. Vielleicht eine "fundierte Vermutung", aber nicht mehr als das.

Lassen Sie mich Ihnen zeigen, was ich bei meiner Analyse für ein solches Szenario beachten würde.

  • Der Docker-Overhead sollte absolut minimal sein. Das Tool "Docker" selbst macht nichts - es verwendet nur normale Linux-Kernel-Funktionen, um eine isolierte Umgebung für Ihre Anwendung zu erstellen.

  • Nachdem das Betriebssystem hochgefahren ist, wird etwas Speicher belegt, richtig. Aber der CPU-Verbrauch durch das Betriebssystem selbst sollte vernachlässigbar sein (selbst für sehr kleine Instanzen). Da Sie erwähnt haben, dass Sie keine Probleme mit dem Speicher haben , können wir davon ausgehen, dass dieser "Betriebssystem-Overhead", den Ihr Kollege erwähnte, wahrscheinlich ebenfalls vernachlässigbar wäre.

  • Wenn Sie die Route als "viele sehr kleine Instanzen" betrachten, können Sie auch den kürzlich veröffentlichten t2.nano -Instanztyp verwenden. Sie müssen testen, ob genügend Ressourcen vorhanden sind, um Ihre Anwendung tatsächlich auszuführen.

  • Wenn Sie die Route als "eine einzelne sehr große Instanz" betrachten, sollten Sie auch die c4.8xl -Instanz berücksichtigen. Dies sollte Ihnen deutlich mehr CPU-Leistung als die c3.8xl geben.

  • Kostenanalyse (Preise in us-east-1):

    • 1x c3.8xlarge: 1.68 $ / h
    • 1x c4.8xlarge: 1.675 $ / h (ungefähr das gleiche wie c3.8xl)
    • 100x t2.micro: 1.30 $ / h (also 100x 0.013 $ / h = 1.30 $ / h)
    • 100x t2.nano: 0,65 $ / h. (Gewinner) (also 100x 0,0065 $ / h = 0,65 $ / h)
  • Analysieren Sie nun die Anzahl der Ressourcen, die Sie für jedes Setup zur Verfügung haben. Ich konzentriere mich nur auf CPU und ignoriere Speicher, da Sie erwähnt haben, dass Ihre Anwendung nicht speicherhungrig ist:

    • 1x c3.8xlarge: 32 vCPU
    • 1x c4.8xlarge: 36 vCPU (jede mit einer besseren Leistung als die c3.8xl; der Chip für c4 wurde speziell von Intel für EC2 entwickelt) (Gewinner)
    • 100x t2.micro: 100x 10% eines vCPU ~="10 vCPU" Aggregats
    • 100x t2.nano: 100x 5% eines vCPU ~="5 vCPU" Aggregats
  • Schließlich analysieren wir die Kosten pro Ressource

    • 1x c3.8xlarge: 1.68 $ / h / 32 vCPU = 0.0525 $ / (vCPU-h)
    • 1x c4.8xlarge: 0.0465 $ / (vCPU-h) (Gewinner)
    • 100x t2.micro: 0.13 $ / (vCPU-h)
    • 100x t2.nano: 0.13 $ / (vCPU-h)

Wie Sie sehen, bieten größere Instanzen typischerweise eine höhere Rechendichte, die normalerweise weniger teuer ist.

Sie sollten auch die Tatsache berücksichtigen, dass die T2-Instanzen "berstbar" sind, da sie für einige Zeit über ihre Basisleistungen (10% und 5% wie oben) hinausgehen können, je nachdem wie viel "CPU-Credits" sie haben . Sie sollten jedoch wissen, dass, obwohl sie mit einem Guthaben beginnen, es normalerweise ausreicht, um das Betriebssystem hochzufahren, und nicht viel mehr (Sie würden mehr CPU-Credits im Laufe der Zeit sammeln, wenn Sie Ihre CPU nicht über Ihre Baseline hinaus schieben) , aber es scheint, dass dies hier nicht der Fall sein wird, da wir für die Leistung optimieren ...). Und wie wir gesehen haben, ist die "Kosten pro Ressource" fast dreimal so hoch wie die der 8xl-Instanzen. Dieser kurze Burst, den Sie erhalten werden, würde wahrscheinlich diese grobe Schätzung nicht ändern.

Sie sollten auch die Netzwerknutzung in Betracht ziehen. Ist das Anwendungsnetzwerk intensiv? Entweder bei Latenzanforderungen oder Bandbreitenanforderungen oder in der Anzahl der Pakete pro Sekunde?

  • Die kleineren Instanzen haben weniger Netzwerkleistung zur Verfügung, die größeren Instanzen haben viel mehr. Aber das Netzwerk für jede kleinere Instanz würde von einer einzelnen Anwendung verwendet werden, während das mächtige Netzwerk der größeren Instanz unter allen Containern geteilt würde. Die 8xl-Instanzen werden mit einer 10Gbps-Netzwerkkarte geliefert. Die t2-Instanzen haben im Vergleich dazu eine sehr geringe Netzwerkleistung.

Was ist nun mit Ausfallsicherheit ? Wie zeitkritisch sind diese Jobs? Was wären die "Kosten, um sie nicht rechtzeitig fertig zu stellen"? Sie können auch einige Fehlermodi in Betracht ziehen:

  • Was passiert, wenn "eine einzige Instanz stirbt"? Im Fall von 1x c3.8xl oder 1x c4.8xl wäre Ihre gesamte Flotte ausgefallen und Ihre Arbeiter würden aufhören. Würden sie sich "erholen" können? Müssten sie ihre Arbeit "neu starten"? Im Fall von "vielen kleinen Instanzen", könnte die Wirkung von "einem einzigen Fall des Sterbens" weniger wirksam sein.

Um den Effekt von "Ein einziges Mal sterben" auf Ihre Arbeitslast zu reduzieren und dennoch Vorteile durch höhere Dichte zu erhalten (dh große c3- oder c4-Instanzen), könnten Sie andere Optionen in Betracht ziehen, wie zum Beispiel: 2x c4.4xl oder 4x c4.2xl und so weiter. Beachten Sie, dass c4.8xl doppelt so viel wie c4.4xl kostet, aber mehr als zweimal die Anzahl der vCPUs enthält. Die obige Analyse wäre also nicht "linear", Sie müssten einige Kosten neu berechnen.

Wenn Sie davon ausgehen, dass die Instanzen "fehlerhaft" sind und Ihre Anwendung damit umgehen kann, sollten Sie auch Spot-Instanzen verwenden. Bei Spot-Instanzen geben Sie Ihren Preis an. Liegt der "Marktpreis" (geregelt durch Angebot - Nachfrage) unter Ihrem Gebot, erhalten Sie die Instanz und zahlen nur den "Marktpreis". Wenn der Preis über Ihrem Gebot schwankt, werden Ihre Instanzen beendet. Es ist nicht ungewöhnlich, bis zu 90% Rabatt im Vergleich zu On Demand zu sehen. Ab sofort beträgt c3.8xl ungefähr 0.28 $ / h in einem AZ (83% weniger als On Demand) und c4.8xl ist ungefähr gleich in einem AZ (83% weniger). Spotpreise sind für t2-Instanzen nicht verfügbar.

Sie können auch Spotblock in Betracht ziehen, in dem Sie die Anzahl der Stunden angeben, für die Sie Ihre Instanzen ausführen möchten. Sie zahlen normalerweise 30% - 45% weniger als On Demand und es gibt keine Risiko, während des von Ihnen angegebenen Zeitraums "auszufallen". Nach dem Zeitraum sind Ihre Instanzen beendet.

Schließlich würde ich versuchen, meine Serverflotte so zu skalieren, dass sie für eine "volle Anzahl von Stunden" (aber nicht mehr als diese Anzahl) benötigt werden (es sei denn, ich muss die Ausführung beenden ASAP ). Das heißt, es ist viel besser, eine kleinere Flotte zu haben, die die Aufträge in 50 Minuten erledigt, als eine größere, die in der Lage ist, den Auftrag in 10 Minuten zu erledigen. Der Grund ist: Sie bezahlen stundenweise, zu Beginn der Stunde. Außerdem ist es in der Regel wesentlich besser, eine größere Flotte zu haben, die die Arbeit in 50 Minuten erledigt als eine kleinere, die 1h05 Minuten benötigt - wieder, weil Sie stundenweise bezahlen, zu Beginn der Stunde.

Schließlich erwähnen Sie, dass Sie nach "der besten Leistung" suchen. Was genau meinst du damit? Was ist Ihr wichtiger Leistungsindikator ? Möchten Sie optimieren, um die insgesamt verbrachte Zeit zu reduzieren? Vielleicht die Zeit "pro Einheit" / "pro Job" reduzieren? Versuchen Sie, Ihre Kosten zu senken? Versuchen Sie, "energieeffizienter" zu sein und Ihren CO2-Fußabdruck zu reduzieren? Oder vielleicht für den Wartungsaufwand optimieren? Oder konzentrieren Sie sich auf die Vereinfachung, um die Anlaufzeit zu verkürzen, die andere Kollegen, die weniger gut informiert sind, benötigen würden, bevor sie in der Lage wären, die Lösung aufrechtzuerhalten?

Vielleicht eine Kombination vieler der obigen Leistungsindikatoren? Wie würden sie kombinieren? Es gibt immer einen Kompromiss ...

Wie Sie sehen, gibt es keinen clear Gewinner. Zumindest nicht ohne genauere Informationen über Ihre Anwendung und Ihre Optimierungsziele. Aus diesem Grund ist die beste Option für jede Art von Leistungsoptimierung das Testen. Testen ist in der Regel auch kostengünstig: Es würde vielleicht ein paar Stunden dauern, um Ihre Umgebung einzurichten, und dann wahrscheinlich weniger als $ 2 pro Stunde.

Also, das sollte Ihnen genug Informationen geben, um Ihre Untersuchung zu beginnen.

Viel Spaß beim Testen!

    
Bruno Reis 14.02.2016 09:52
quelle
0

Basiert auf EC2-Instanzen-CPU allein

  • 100 t2.micro haben weniger als 1/3 der CPU-Leistung von c4.8xl
  • 100 t2.small haben weniger als 2/3
  • 50 t2.large kommen vielleicht näher.

Es ist ziemlich wahrscheinlich, dass c4.8xl viel schneller wäre, aber niemand kann das autoritär sagen. Als beginnt Bruno mit , Sie müssen Ihre Workload durch Ihre App auf beiden Instanztypen laufen lassen. Es gibt 1000 Variablen, die die Ergebnisse beeinflussen könnten. Es gibt keinen unmittelbaren Grund, warum Sie nicht 100 Container / Prozesse auf einem Linux-Host ausführen können, sondern schon seit langer Zeit Multi-Core-, Multi-Prozess. Es kann einige einfache Systemgrenzen geben, die während des Betriebs angepasst werden müssen ( ulimit -a und sysctl -a ). Auf der anderen Seite kann etwas in Ihrer Anwendung in diesem Setup wirklich schlecht sein.

Jeder Docker-Overhead wird praktisch aufgehoben, wenn Sie einen Container sowohl in Ihrem Einzel- als auch in Ihrem Multiinstance-Setup ausführen. Alles, was Sie in diesem Bereich verbessern können, wird dazu beitragen, die Probleme zu begrenzen, die Sie auf dem freigegebenen Host haben. IBM hat einen großartigen Bericht Aktualisierten Leistungsvergleich virtueller Maschinen veröffentlicht und Linux Containers , die Docker Overheads detailliert darstellen.

  • Der Container-Overhead ist für die CPU / den Speicher vernachlässigbar.
  • NAT-Netzwerke enthalten einige Gemeinkosten, also verwenden Sie net=host .
  • AUFS-Datenträger wird Overhead verursachen. Für alles Schreibintensive mounten Sie Ihre Hosts EBS / SSD direkt in den Container.

Ein großer Unterschied zu vielen Docker-Containern ist, dass die Arbeitslast auf dem Prozess-Scheduler der VM völlig anders ist. Es wird nicht unbedingt schlimmer, wenn Sie mehr Container fahren, aber Sie befinden sich in einem "weniger getesteten" Gebiet. Sie verlassen sich weniger auf den Xen-Hypervisor, der auf der Hardware läuft, und mehr auf den Linux-Kernel, der in der VM zum Planen ausgeführt wird, der zwei völlig unterschiedliche Algorithmen verwendet. Auch hier ist Linux in der Lage, viele Prozesse auszuführen und Konflikte zu lösen, aber Sie werden nur die Antwort für Ihre App finden, indem Sie es testen.

Also bei einer vollständigen Schätzung, die Ihre Anwendung in keiner Weise berücksichtigt, rein auf allgemeine Maschinenspezifikationen und eine CPU-schwere Arbeitslast.

  • Der c4.8xl sollte schneller sein als ein t2.nano und t2.micro setup.
  • t2.small s könnte sich schließen.
  • 50 x t2.large s mit 2 Containern könnte gleichrangig sein.
  • 100 x m3.mediums würde es blitzen.
  • 3 x c4.8xl gibt Ihnen den schnellsten Prozessor-Hyper-Thread, der jedem Prozess / Thread Ihrer App gewidmet ist.

tl; dr Testen Sie alle. Verwenden Sie die schnellste.

    
Matt 14.02.2016 16:35
quelle
0

In einem allgemeinen Fall würde ich Docker verwenden. Einfach weil es einfacher und schneller ist, Knoten hinzuzufügen / zu ändern / zu entfernen und Load Balancing durchzuführen. Ich gehe hier davon aus, dass Sie nicht genau 100 Knoten benötigen, sondern eine sich ändernde Anzahl von ihnen.

Es ist auch viel schneller einzurichten. Es gibt etwas, das Docker-Schwarm heißt Ссылка und ich bin mir sicher, dass es sich lohnt, einen Blick darauf zu werfen. Wenn Sie keine 100, 1000 oder 10000 Container auf einer physischen Maschine (VM sogar?) Platzieren können, können Sie sie auch mit dem Overlay-Netzwerk Ссылка

BEARBEITEN: Nachdem Sie die Frage erneut gelesen haben, scheint es, dass Sie eine eher leistungsbezogene Antwort wünschen. Es ist wirklich schwer zu sagen (wenn nicht unmöglich) ohne zu testen. Bei der Performance gibt es immer Vorbehalte und Dinge, an die man nicht denken kann (auf einem einfachen Konto, Mensch zu sein :)). Für das Einrichten von 100 oder 3 oder 999999 Geräten ist es viel mehr Zeit, die gleiche Anzahl an Docker-Containern einzurichten. Ich weiß, dass die Container / Bild-Terminologie immer noch durcheinander gebracht wird, um nur zu verdeutlichen - Sie würden ein Docker-Image erstellen, was ein wenig Arbeit ist, und es dann in N-Instanzen (Container) ausführen. Jemand korrigiert mich bitte für die Terminologie, wenn ich falsch liege - das ist etwas, was ich oft mit Kollegen diskutiere:)

    
cantSleepNow 17.02.2016 14:45
quelle