Dynamisches Zuweisen von Speicher zu einer AWS Elastic Beanstalk-Umgebung mit mehreren Docker-Containern, in der Java-Anwendungen ausgeführt werden

8

Ich möchte jede mögliche Unze des Gebrauchs aus der freien elastischen Bohnenstangenstufe herausdrücken.

Mein Backend besteht aus einer Reihe von Microservices (mit ktor). Ich habe 5 Microservices , um genau zu sein. Alle diese sind dockerized und ich versuche , sie alle auf dem gleichen winzigen zu laufen t2.micro (frei) elastische Bohnenstengel Instanz mit der Multi-Docker Bild Umgebung

Da Java Java ist, werden gerne etwa 200 MB RAM pro Docker-Container für den einfachsten Microservice im Leerlauf verwendet.

Mit t2.micro erhalten Sie also 1 GB RAM. Ich habe 5 Microservice-Docker-Container, die jeweils mindestens 200 MB erfordern = ganz in der Nähe.

Das Problem ist, dass die Erinnerung fast immer fast immer zu 100% schwebt.

Gibt es also eine Möglichkeit, den Docker-Containern dynamisch Speicher zuzuweisen, je nachdem, wie viel frei ist und wie dringend ein Container ihn benötigt?

Angenommen, ein Container hebt schwer, während die anderen größtenteils im Leerlauf sind. Ich möchte etwas RAM auf den Container richten, der die schwere Aufgabe erledigt, und nach Abschluss der Aufgabe auf die gleiche RAM-Zuweisung pro Container zurückgreifen.

Gibt es eine Möglichkeit, dies zu tun?

Aditya Anand
quelle

Antworten:

1

Sie können docker update --memory-reservation xxx <container>die Soft-Limit-Speicherzuordnung für einen Container während der Ausführung ändern. Docker drückt Container vorsichtig an ihre weichen Grenzen, wenn der Gesamtspeicher niedrig ist. Sie können also weiche Grenzwerte von beispielsweise 150 MB für alle Ihre Container festlegen und dann einen davon erhöhen, wenn Sie wissen, dass zusätzliche Arbeit zu erledigen ist.

Die Docker-Dokumentation zu Soft Limits ist nicht so gut, die Kerneldokumentation für CGroup Memory erklärt es besser.

CantankerousBullMoose
quelle
Danke, ich werde das genauer untersuchen. Im Idealfall würde ich mir jedoch eine Lösung wünschen, die z. B. die Speichernutzung mehrerer Container dynamisch überwacht und dem Speicher, der zu jedem Zeitpunkt sehr nahe am höchsten ist, mehr Speicher zur Verfügung stellt (um die Leistung zu maximieren). Auf einem Server wäre es also nicht wirklich möglich, die Grenzwerte manuell weiter zu ändern, da sie möglicherweise vom Cron-Job-Timing, vom Datenverkehr usw. abhängen.
Aditya Anand
Wie unterscheidet sich das davon, überhaupt keine Speicherverwaltung zu haben? Wenn eine JVM-Instanz in einem Container eine Speicherzuweisung anfordert und eine andere JVM-Instanz in einem anderen Container nicht verwendeten Heap-Speicherplatz hält, gibt die zweite JVM ihn auf und lässt die erste ihn haben ... Richtig?
CantankerousBullMoose
Ist das so? Können Sie auf eine maßgebliche Quelle zu diesem Thema verweisen? Nach meiner Erfahrung scheint es ein bisschen zufällig zu sein. Manchmal entscheidet sich eine Instanz dafür, den nicht verwendeten Heap beizubehalten, selbst wenn die andere Instanz ausgehungert ist. In diesem Fall verwenden die anderen Instanzen mehr ausgelagerten Speicher, was die Arbeit verlangsamt.
Aditya Anand
1
Dies klingt eher nach einem Java-Problem als nach einem Docker-Problem. Ich habe nicht viel Zeit damit verbracht, mit ihnen zu spielen, aber -XX: MaxHeapFreeRatio und -XX: MinHeapFreeRatio sollen steuern, wie aggressiv die JVM das Betriebssystem nimmt und Speicher vom Betriebssystem bereitstellt. Vielleicht würden Sie dadurch konsistentere Ergebnisse erzielen? Die Oracle-Dokumente zur Garbage Collection enthalten einige Details zu diesen Flags.
CantankerousBullMoose
Ja, das steuert wirklich nur die statische Startkonfiguration, mit der ich einen Java-Prozess bereitstellen kann, und nicht, wie ich den Speicher, der je nach Bedarf verschiedenen Prozessen zugewiesen ist, dynamisch verwalten kann.
Aditya Anand