2014-04-16 30 views
10

Uruchamiam aplikację internetową java na tomcat w kontenerze Docker.Jak monitorować użycie pamięci aplikacji java w Dockerze

Czy istnieje sposób monitorowania użycia pamięci aplikacji Java? Próbuję użyć jconsole z identyfikatorem procesu w oknie dokowanym, ale jest on również informowany o tym, że ja też włączam JMX w tomcat, ale nie wiem, jak powiązać go. Mogę użyć visualvm z mojego lokalnego, aby powiązać maszynę hosta, ale nie mogę znaleźć sposobu powiązania okna dokera z hostem.

Czy jest jakiś dobry sposób, aby to osiągnąć?

Dzięki

+1

Aby uzyskać ogólne wykorzystanie pamięci, powinieneś być w stanie monitorować proces kontenera dokera, prawda? Nie z jconsole, ponieważ nie jest to proces Java, ale z narzędziami Linuksa, takimi jak 'top',' ps', 'smem' itp. Czy rozmawiasz o debugowaniu pamięci i czy potrzebujesz bardziej szczegółowych informacji? – qkrijger

+0

@qkrijger Tak, chcę debugować problem z wyciekiem pamięci. Wiem, że mogę uruchomić aplikację lokalnie, aby to zrobić. Chciałbym tylko wiedzieć, czy istnieje jakikolwiek inny sposób, aby to osiągnąć. Dzięki –

+1

ok, co powiesz na uruchomienie 'jconsole' na twoim hoście i użycie http://stackoverflow.com/questions/856881/how-to-activate-jmx-on-my-jvm-for-access-with-jconsole i Docker udostępnia port zdalny jmx? – qkrijger

Odpowiedz

3

monitorować jego użytkowania, trzeba uzyskać to prawdziwe Process ID. Jeśli używasz Tomcat bezpośrednio w zbiorniku, to powinno być:

DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)` 

Jeśli używasz coś podobnego baseimage Phusion, wtedy Twój proces java będzie dziecko tego procesu. Aby zobaczyć hierarchię zastosowanie:

pstree $DOCKER_ROOT_PROC 

Gdy trzeba, że ​​można napisać skrypt za pomocą

ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC 

w skrypcie rekursywnie znaleźć proces java chcesz monitorować (z filtrowania niektóre Regular Expression , oczywiście). Wreszcie można to wykorzystać, aby uzyskać zużycie pamięci z aplikacji JAVA w kilobajtach:

ps -o vsz -p $JAVAPROCESS 

ja nie wiem, czy to może być używane z JConsole, ale jest to sposób monitorowania wykorzystania pamięci.

3

Do monitorowania kontenerów doków polecam Google's cAdvisor project. W ten sposób masz ogólne rozwiązanie do monitorowania kontenerów doków. Po prostu uruchom aplikację, cokolwiek to jest, w kontenerze w doku i sprawdź, jak działa procesor i pamięć. Tutaj masz http API, a także webowy interfejs użytkownika.

6

Aby połączyć się z procesu java z systemem w biegu pojemnika doker w boot2docker z visualvm można spróbować wykonać następujące czynności:

rozpocząć proces java przy użyciu następujących opcji:

java -Dcom.sun.management.jmxremote.port=<port> \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \ 
-Dcom.sun.management.jmxremote.rmi.port=<port> \ 
-Djava.rmi.server.hostname=<boot2docker_ip> \ 
<Main> 

trzeba uruchomić twój obraz z --expose <port> -p <port>:<port>.

Następnie "Dodaj połączenie JMX" w visualvm z <boot2docker_ip>:<port>.

Nie powinno to być wiele bez numeru boot2docker.

+1

Upewnij się, że nie masz opcji "-Dcom.sun.management.jmxremote.local.only = false", ponieważ z tego powodu nie działa ona dla mnie. Twoja odpowiedź pomogła mi to rozgryźć. Dzięki! –

0

Powyższe cAdvisor nie pomoże w monitorowaniu Tomcat pracującego wewnątrz kontenera. Możesz rzucić okiem na kontener dokera klienta SPM, który dokładnie to robi!Ma agentów do monitorowania wielu różnych aplikacji działających w Docker - Elasticsearch, Solr, Tomcat, MySQL, i tak dalej: https://github.com/sematext/docker-spm-client

0

do monitorowania zużycia pamięci aplikacji w Döcker, można również uruchomić ejstatd wewnątrz Twój kontener Docker (wywołanie mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" & z folderu ejstatd przed uruchomieniem głównego procesu kontenerowego), odsłaniając te 3 porty do hosta Docker za pomocą docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage.

Następnie możesz połączyć się z tym specjalnym demonem jstatd, używając na przykład JVisualVM, dodając "Host zdalny", określając nazwę hosta Docker jako "Nazwę hosta" i dodając "Niestandardowe połączenia jst" (w "Ustawieniach zaawansowanych"). "), ustawiając" 2222 "na" Port ".

Nota prawna: Jestem autorem tego narzędzia open source.