2016-01-04 10 views
5

Jeśli wykonam docker run --memory=X, aby uruchomić aplikację Java za pośrednictwem skryptu Bash, czy istnieje sposób, aby uzyskać ten skrypt Bash do niezawodnie wnioskować,, ile pamięci zostało przydzielone do pojemnika? Zasadniczo, chcę ten skrypt Bash zrobić coś takiego:Automatycznie skonfiguruj Javę tak, aby używała maksymalnej pamięci RAM przydzielonej do jego kontenera Docker

#!/bin/bash 

# (Do some other stuff...) 

MAX_RAM="$(get-max-ram)" 
exec java "-Xms${MAX_RAM}" "-Xmx${MAX_RAM}" -jar my_jar.jar 

również, jeżeli robię powyższego powinienem zrobić Java użyć trochę mniej niż maksymalna RAM?

+1

Nie zapomnij o PermSize;) (Wtedy nie używać maksymalnej RAM ..) –

+1

@ Gaël permsize nie ma znaczenia, ponieważ Java 8. – Gimby

+0

Rzeczywiście, zależy to od wersji Java. Dzięki za tę precyzję. –

Odpowiedz

4

Docker używa cgroups do realizacji limitów zasobów. Wewnątrz kontenera można użyć narzędzia cgget, aby wydrukować parametry różnych podsystemów (w tym przypadku podsystemu memory).

Rozważmy na przykład pojemnik zaczął z limitem pamięci 64G (to jest Java, po wszystkich):

> docker run --memory=64G 

w pojemniku, a następnie użyć cgget aby odczytać aktualną wartość parametru memory.limit_in_bytes:

> cgget -nvr memory.limit_in_bytes/
68719476736 

Pamiętaj, że prawdopodobnie będziesz musiał najpierw zainstalować plik binarny cgget za pośrednictwem menedżera pakietów obrazu kontenera. W systemie Ubuntu potrzebny jest pakiet cgroup-bin.

można następnie użyć tej wartości do dynamicznie obliczyć parametry JVM (tylko jako przykład, dostosować do własnych potrzeb):

MAX_RAM=$(cgget -nvr memory.limit_in_bytes /) 
JVM_MIN_HEAP=$(printf "%.0f" $(echo "${MAX_RAM} * 0.2" | bc)) 
JVM_MAX_HEAP=$(printf "%.0f" $(echo "${MAX_RAM} * 0.8" | bc)) 
exec java "-Xms${JVM_MIN_HEAP}" "-Xmx${JVM_MAX_HEAP}" -jar my_jar.jar 

Ważne: Kiedy uruchomić bez ograniczeń pamięci (tj bez --memory=X flagi), parametr memory.limit_in_bytes nadal mają wartości, ale o wielkości około 2^63 - 4096:

> cgget -nvr memory.limit_in_bytes/
9223372036854771712 

Jeśli nie chcesz, aby uruchomić JVM o minimalnej przestrzeni sterty około 8 EB skrypt punkt_wejścia powinny również rozważyć tę sprawę:

MAX_RAM=$(cgget -nvr memory.limit_in_bytes /) 
if [ $MAX_RAM -le 137438953472 ] ; then 
    JVM_MIN_HEAP=$(printf "%.0f" $(echo "${MAX_RAM} * 0.2" | bc)) 
    JVM_MAX_HEAP=$(printf "%.0f" $(echo "${MAX_RAM} * 0.8" | bc)) 
else 
    JVM_MIN_HEAP=32G 
    JVM_MAX_HEAP=128G 
fi 

exec java "-Xms${JVM_MIN_HEAP}" "-Xmx${JVM_MAX_HEAP}" -jar my_jar.jar 
+2

Nie został on wyraźnie zgłoszony w twoim przykładzie. Ale czy mnożycie wartość max i min, aby być mniejszą od kontenera, aby JVM mogła obsłużyć sytuację OOM przed potencjalnym wyjściem kontenera? –

Powiązane problemy