2014-04-16 7 views
10

Eseguo l'applicazione web Java su tomcat nel contenitore Docker.Come monitorare l'utilizzo della memoria dell'applicazione java nella finestra mobile

C'è un modo per monitorare l'utilizzo della memoria dell'applicazione java? Provo ad usare jconsole con l'id di processo della finestra mobile, ma mi dice Invalidate process id

Abilito anche JMX in tomcat, ma non so come associarvi ad esso. Posso usare visualvm dal mio locale per collegare la macchina host, ma non riesco a trovare il modo di collegarmi alla finestra mobile all'interno dell'host.

C'è qualche buon modo per raggiungere questo obiettivo?

Grazie

+1

Per ottenere l'utilizzo complessivo della memoria dovresti essere in grado di monitorare il processo del contenitore finestra mobile, giusto? Non con jconsole, dal momento che non è un processo Java, ma con strumenti Linux come 'top',' ps', 'smem' ecc. O stai parlando di debugging della memoria e vuoi informazioni più dettagliate? – qkrijger

+0

@qkrijger sì, voglio eseguire il debug del problema di perdita di memoria. So che posso eseguire l'applicazione localmente per farlo. Voglio solo sapere c'è un modo remoto per raggiungere questo obiettivo. Grazie –

+1

ok, che ne dici di eseguire 'jconsole' sul tuo host e utilizzare http://stackoverflow.com/questions/856881/how-to-activate-jmx-on-my-jvm-for-access-with-jconsole e in Docker espone la porta remota jmx? – qkrijger

risposta

3

Per monitorare è l'utilizzo, è necessario per ottenere che sia vero ID di processo. Se si esegue Tomcat direttamente nel contenitore, allora dovrebbe essere:

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

Se si utilizza qualcosa come baseimage di Phusion, quindi il processo di Java sarà un figlio di quel processo. Per vedere l'uso gerarchia:

pstree $DOCKER_ROOT_PROC 

Una volta che avete che, è possibile scrivere lo script utilizzando

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

Nello script ricorsivamente per trovare il processo di Java che si desidera monitorare (con la filtrazione qualche espressione regolare , ovviamente). Poi finalmente è possibile utilizzare questo per ottenere l'utilizzo della memoria della vostra applicazione java in kilobyte:

ps -o vsz -p $JAVAPROCESS 

Non so se questo può essere utilizzato con JConsole, ma è un modo di monitorare l'utilizzo della memoria.

3

Per monitorare i contenitori docker, è consigliabile Google's cAdvisor project. In questo modo hai una soluzione generale per monitorare i contenitori di finestre mobili. Basta eseguire la tua app, qualunque essa sia, in un contenitore docker e controllare cose come l'uso della CPU e della memoria. Qui hai una http API e un web ui.

6

Per connettersi a un processo Java in esecuzione in un contenitore di finestra mobile in esecuzione in boot2docker con visualvm si può provare il seguente:

Avviare il processo java utilizzando le seguenti opzioni:

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> 

è necessario eseguire la tua immagine con --expose <port> -p <port>:<port>.

Quindi "Aggiungi connessione JMX" in visualvm con <boot2docker_ip>:<port>.

Non dovrebbe essere molto diverso senza boot2docker.

+1

Assicurati di non avere l'opzione "-Dcom.sun.management.jmxremote.local.only = false" poiché questo era il motivo per cui non funzionava per me. La tua risposta mi ha aiutato a capirlo. Grazie! –

0

cAdvisor non consente di monitorare Tomcat in esecuzione all'interno del contenitore. Si consiglia di dare un'occhiata al contenitore mobile del client SPM, che fa esattamente questo!Ha gli agenti per il monitoraggio di una serie di diverse applicazioni in esecuzione in Docker - elasticsearch, Solr, Tomcat, MySQL, e così via: https://github.com/sematext/docker-spm-client

0

Per il monitoraggio dell'utilizzo della memoria della vostra applicazione in Docker, è anche possibile lanciare un ejstatd all'interno il contenitore Docker (chiamando mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" & dalla cartella ejstatd prima di avviare il processo del contenitore principale), esponendo queste 3 porte all'host Docker utilizzando docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage.

Quindi sarà possibile connettersi a questo demone jstatd speciale utilizzando JVisualVM ad esempio, aggiungendo un "Host remoto" specificando il nome host Docker come "Nome host" e aggiungendo un "Collegamenti jstatd personalizzati" (in "Impostazioni avanzate" ") impostando" 2222 "su" Porta ".

Disclaimer: Sono l'autore di questo strumento open source.