2016-08-03 18 views
6

Ich bin mehrere Microservices (Spring Cloud + Docker) in kleinen/mittleren Maschinen auf AWS laufen und kürzlich habe ich festgestellt, dass diese Maschinen oft erschöpft sind und neu starten müssen. Ich untersuche die Ursachen für diesen Stromausfall und denke dabei an mögliche Speicherlecks oder Fehlkonfigurationen auf der Instanz/dem Container.Spring Cloud Microservices Speicherauslastung

Ich habe versucht, die Menge an Speicher diese Behälter, indem Sie verwenden können, zu begrenzen:

docker run -m 500M --memory-swap 500M -d my-service:latest 

An dieser Stelle meinen Dienst (Standard Feder Cloud-Service mit einem einzigen Endpunkt, die Sachen zu einem Redis DB, mit Feder schreibt -Data-Redisis) begann nicht einmal.

erhöhte den Speicher 760M und es funktionierte, aber die Überwachung mit Docker sehe ich das Minimum ist:

CONTAINER   CPU %    MEM USAGE/LIMIT  MEM %    NET I/O    BLOCK I/O    PIDS 
cd5f64aa371e  0.18%    606.9 MiB/762.9 MiB 79.55%    102.4 MB/99 MB 1.012 MB/4.153 MB 60 

ich einige Parameter hinzugefügt, um die JVM Heap-Speicher zu begrenzen, aber es scheint nicht, es zu reduzieren sehr viel:

_JAVA_OPTIONS: "-Xms8m -Xss256k -Xmx512m" 

ich bin mit

  • Frühling Wolke Brixton.M5
  • Frühlings-Boot 1.3.2
  • Java 8 (Oracle JVM)
  • Docker
  • Frühling Daten Redis 1.7.1

Gibt es einen Grund, warum eine solche einfachen Dienst so viel Speicher verwendet zu laufen ? Gibt es irgendwelche Funktionen, die ich deaktivieren sollte, um das zu verbessern?

+1

+1 Ich habe auch ein ähnliches Verhalten. Ich betreibe eine Reihe von Microservices, die Spring Cloud ausführen, Brixton.RC1 verwenden und in Dockercontainern ausgeführt werden (im Docker 1.12 Swarm-Modus). Meine Container verwenden mehr als 800 MB Speicher. Ich habe mein Dockerfile-Basisbild so bearbeitet, dass es 'FROM java: 8-jre-alpine' anstelle des nicht-alpinen JDK-Basisbildes verwendet, das ich ursprünglich verwendet habe ... aber das half nicht viel. Hat jemand andere Ideen? – Fabian

+0

Ich habe auch den gleichen Container auf meiner RHEL-Box mit Docker 1.12 und meinem persönlichen Mac mit Docker für Mac 1.12 Beta 21 ausgeführt. Der Container auf der RHEL-Box verwendete ungefähr 800 MB Speicher und der auf meinem Mac verwendete nur 350 MB Speicher. Beide Container wurden mit dem gleichen docker run-Befehl gestartet. – Fabian

+0

+1. Gleiches Problem mit Feder und Docker. In meinen Diensten benutze ich Hibernate, Spring Data REST, Spring Security, Jackson usw. Und alle von ihnen verbrauchen über 350mb-500mb und manchmal Absturz, obwohl sie nicht verwendet werden. Ich dachte, Microservices sollten leicht sein. Aber mit dieser Speicherbelegung ... – CyberAleks

Antwort

-1

Gemäß Spring Installing Spring Boot applications page können Sie das Anwendungsstartskript durch Umgebungsvariable oder Konfigurationsdatei mit der Variablen JAVA_OPTS anpassen.

Zum Beispiel: JAVA_OPTS = -Xmx64m

1

Wir in Bezug auf die JVM eine Reihe von Dingen in einer ähnlichen Einrichtung untersucht habe sich. Ein schneller Weg, um etwas Speicherplatz zu sparen, wenn Sie Java 8 die folgenden Optionen verwenden:

-Xms256m -Xmx512m -XX:-TieredCompilation -Xss256k -XX:+UseG1GC -XX:+UseStringDeduplication 

Die G1GC gut dokumentiert ist, reduziert sich die UseStringDeduplication Heap-Nutzung durch Deduplizierung die Speicherung von Strings in dem Heap (wir gefunden etwa 20% in einer JSON/XML-Webservice-Umgebung), und die TieredCompilation macht einen großen Unterschied bei der Verwendung von CodeCache (von 70 MB auf 10 MB) sowie etwa 10% weniger Metaspace auf Kosten von etwa 10% Startup Zeit.

Verwandte Themen