2014-04-16 17 views
10

Ich führe die Java-Webanwendung auf Tomcat im Docker-Container.Wie Java-Anwendung Speicherauslastung in Docker zu überwachen

Gibt es eine Möglichkeit, die Speichernutzung der Java-Anwendung zu überwachen? Ich versuche, jconsole mit der Prozess-ID des Dockers zu verwenden, aber es sagt mir Invalidate process id

ich auch JMX in Tomcat aktivieren, aber nicht wissen, wie man an es bindet. Ich kann visualvm von meinem lokalen verwenden, um den Host-Rechner zu binden, aber kann keine Möglichkeit finden, an den Docker innerhalb des Hosts zu binden.

Gibt es einen guten Weg, dies zu erreichen?

Dank

+1

Um die Gesamtspeicherauslastung zu erhalten, sollten Sie in der Lage sein, den Docker-Container-Prozess zu überwachen, richtig? Nicht mit jconsole, da dies kein Java-Prozess ist, sondern mit Linux-Tools wie "top", "ps", "smem" usw. Oder sprichst du Memory Debugging und willst mehr Informationen? – qkrijger

+0

@qkrijger ja, ich möchte das Speicherleck Problem debuggen. Ich weiß, dass ich die Anwendung lokal ausführen kann, um dies zu tun. Ich will nur wissen, gibt es einen entfernten Weg, um dies zu erreichen. Danke –

+1

ok, was ist mit dem Ausführen von 'jconsole' auf Ihrem Host und http://StackOverflow.com/questions/856881/how-to-activate-jmx-on-my-jvm-for-access-with-jconsole und in Docker den jmx remote Port freilegen? – qkrijger

Antwort

3

Zur Überwachung es Nutzung ist, müssen Sie es real Prozess-ID zu erhalten. Wenn Sie tomcat direkt in den Behälter laufen, dann sollte es sein:

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

Wenn Sie so etwas wie Phusion des baseimage verwenden, dann Java-Prozess ein Kind dieses Prozesses sein wird. Um die Hierarchie Verwendung zu finden:

pstree $DOCKER_ROOT_PROC 

Sobald Sie, dass können Sie Ihren Skript schreiben

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

In Ihrem Skript rekursiv den Java-Prozess, den Sie wollen finden überwachen (mit einiger Regular Expression Filterung , Na sicher). Dann endlich können Sie diese verwenden, um Ihre Java-Anwendung Speichernutzung in Kilobyte zu erhalten:

ps -o vsz -p $JAVAPROCESS 

Ich weiß nicht, ob dies mit jconsole verwendet werden kann, aber es ist eine Möglichkeit, die Speichernutzung zu überwachen.

3

Um Docker Container zu überwachen, empfehle ich Google's cAdvisor project. Auf diese Weise haben Sie eine allgemeine Lösung zum Überwachen von Docker-Containern. Führen Sie einfach Ihre App, was auch immer das ist, in einem Andock-Container aus und überprüfen Sie Dinge wie CPU- und Speicherverbrauch. Hier haben Sie eine http-API sowie eine Web-UI.

6

zu einem Java-Prozess in einem Docker Behälter läuft in boot2docker mit visualvm laufen verbinden Sie folgende versuchen:

Starten Sie Ihren Java-Prozess die folgenden Optionen:

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> 

Sie müssen laufen Ihr Bild mit --expose <port> -p <port>:<port>.

Dann "JMX-Verbindung hinzufügen" in visualvm mit <boot2docker_ip>:<port>.

Es sollte nicht viel anders sein ohne boot2docker.

+1

Stellen Sie sicher, dass Sie nicht die Option "-Dcom.sun.management.jmxremote.local.only = false" haben, da dies der Grund war, warum es für mich nicht funktionierte. Ihre Antwort hat mir geholfen, es herauszufinden. Vielen Dank! –

0

Der oben erwähnte cAdvisor hilft nicht bei der Überwachung von Tomcat, der im Container läuft. Vielleicht möchten Sie sich den Docker-Container von SPM Client ansehen, der genau das tut!Es verfügt über die Agenten für die Überwachung einer Reihe von verschiedenen Anwendungen in Docker - Elasticsearch, Solr, Tomcat, MySQL und so weiter: https://github.com/sematext/docker-spm-client

0

Für die Speicherauslastung Überwachung Ihrer Anwendung in Docker, können Sie auch eine ejstatd innerhalb starten Ihr Docker-Container (ruft mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" & aus dem ejstatd-Ordner auf, bevor der Hauptcontainerprozess gestartet wird) und stellt diese 3 Ports dem Docker-Host unter Verwendung von docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage zur Verfügung.

Dann können Sie mit JVisualVM eine Verbindung zu diesem speziellen jstatd-Daemon herstellen, indem Sie beispielsweise einen "Remote Host" hinzufügen, der Ihren Docker-Hostnamen als "Hostname" angibt und eine "Benutzerdefinierte jstatd-Verbindung" hinzufügt (in den "Erweiterten Einstellungen") ") durch Setzen von" 2222 "auf" Port ".

Haftungsausschluss: Ich bin der Autor dieses Open-Source-Tools.