2016-08-03 12 views
6

Używam wielu mikroserwisów (chmura wiosenna + doker) w małych/średnich komputerach na AWS, a ostatnio odkryłem, że te maszyny są często wyczerpane i wymagają ponownego uruchomienia. Badam przyczyny tej utraty mocy, myśląc o możliwych wyciekach pamięci lub błędnych konfiguracjach na instancji/kontenerze.Wykorzystanie pamięci microservices w chmurze Spring

Starałem się ograniczyć ilość pamięci te pojemniki mogą korzystać wykonując:

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

W tym momencie moja usługa (standard wiosna cloud service z jednego punktu końcowego, który pisze rzeczy do Redis DB, używając wiosny -data-redis) nawet się nie zaczęło.

Zwiększona pamięć do 760M i to działało, ale monitorowanie go dokowanym widzę minimalna wynosi:

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 

dodałem kilka parametrów, aby ograniczyć pamięci sterty JVM, ale nie wydaje się, aby ją zmniejszyć bardzo dużo:

_JAVA_OPTIONS: "-Xms8m -Xss256k -Xmx512m" 

biegnę

  • Wiosna Chmura Brixton.M5
  • Wiosna Boot 1.3.2
  • Java 8 (Oracle JVM)
  • Docker
  • Wiosna dane Redis 1.7.1

Czy istnieje powód, dlaczego tak prosty serwis używa tak dużo pamięci do uruchomienia ? Czy są jakieś funkcje, które powinienem wyłączyć, aby to poprawić?

+1

+1 Mam podobne zachowanie. Prowadzę serię Microservices obsługujących Spring Cloud, używając Brixton.RC1 i działając w kontenerach docker (działa w trybie roota 1.12). Moje pojemniki zużywają ponad 800 MB pamięci. Zmieniłem swój podstawowy obraz Dockerfile, aby używał 'FROM java: 8-jre-alpine' zamiast nie-alpejskiego obrazu bazowego JDK, którego początkowo używałem ... ale to nie pomogło. Ktoś ma inne pomysły? – Fabian

+0

Uruchomiłem także ten sam kontener na moim pudełku RHEL z dockerem 1.12 i moim osobistym komputerem Mac z Docker dla Mac 1.12 beta 21 na nim działającym. Pojemnik na pudełku RHEL zużywał około 800 MB pamięci, a na moim Macu było tylko 350 MB pamięci. Oba kontenery zostały uruchomione przy użyciu tego samego polecenia dokowania. – Fabian

+0

+1. Ten sam problem z wiosną i dokiem. W moich usługach korzystam z Hibernate, Spring Data REST, Spring Security, jackson itd. Wszystkie z nich zużywają ponad 350mb-500mb i czasami się zawieszają, chociaż nie będą używane. Myślałem, że mikroserwisy powinny być lekkie. Ale przy użyciu pamięci ... – CyberAleks

Odpowiedz

-1

Zgodnie z wersją Installing Spring Boot applications page Spring można dostosować skrypt uruchamiania aplikacji za pomocą zmiennej środowiskowej lub pliku konfiguracyjnego ze zmienną JAVA_OPTS.

Na przykład: JAVA_OPTS = -Xmx64m

1

Zbadaliśmy wiele rzeczy w podobnej konfiguracji pod względem samej JVM. Szybkim sposobem, aby zaoszczędzić trochę pamięci, jeśli przy użyciu Java 8 jest skorzystanie z następujących opcji:

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

G1GC jest dobrze udokumentowane, UseStringDeduplication zmniejsza zużycie sterty przez de-duplikacji przechowywanie łańcuchów w stercie (okazało około 20% w środowisku typu usługi sieciowej JSON/XML), a TieredCompilation robi dużą różnicę w korzystaniu z CodeCache (od 70 MB do 10 MB), a także około 10% mniej Metasprzestrzeni kosztem około 10% uruchamiania czas.

Powiązane problemy