Come posso monitorare la memoria JVM in modo corretto?

9

Sto pensando a come facciamo il monitor della memoria JVM in un modo troppo basso nell'ambiente di produzione anche sotto l'orario di punta.

Supponiamo di avere due app server Tomcat in produzione, bilanciamento del carico impostato dietro di essi. Se riesco a vedere le statistiche della memoria jvm, posso dire che il bilanciamento del carico interrompe l'invio della richiesta al server che riscontra il problema di OOM. Questo ha senso? Jconsole o VisualVM mangiano più resume delle prestazioni non è la mia scelta.

    
posta Vance 19.04.2012 - 17:11
fonte

3 risposte

3

JMX sarebbe la risposta (Jolokia è un'interfaccia JMX).

Potresti voler anche guardare - link

    
risposta data 20.04.2012 - 00:21
fonte
1

Altri hanno fornito suggerimenti su come monitorare l'utilizzo della memoria ...

Suppose I have two tomcat app server in production, load balance set up behind them. If I can see the jvm memory statistics I can tell load balance to stop sending the request to the server which will encounter OOM issue. Do this make sense?

Ordina. Ma non è necessariamente il modo migliore per risolvere il tuo problema.

Consente di tornare alla radice del problema ... le OOME. Nel contesto di Tomcat, è probabile che OOME sia causato da uno dei seguenti:

  • perdite di memoria nell'applicazione, (o possibilmente Tomcat stesso),
  • tenta di elaborare troppe richieste in parallelo su ciascun Tomcat o
  • richieste individuali che richiedono troppa memoria durante l'elaborazione.

Per risolvere il tuo problema, devi prima scoprire quale di questi sta accadendo ... perché la soluzione è diversa per ognuno di essi.

1) Per vedere se si tratta di una perdita di memoria, è necessario utilizzare uno strumento di analisi della memoria per esaminare i modelli di utilizzo della memoria a lungo termine. Questo probabilmente mostrerà un motivo a dente di sega ... che è normale. Quello che devi cercare è il livello del fondo dei "denti" che tende verso l'alto nel tempo. Ciò indica che qualcosa sta creando spazzatura che non può essere raccolta; cioè una perdita di memoria.

Se hai una perdita di memoria, la soluzione migliore è capire quale parte del codice è responsabile e correggerla. Qualsiasi altra cosa ... compreso il bilanciamento del carico ... è una soluzione bandaid e potrebbe portare a problemi peggiori in pista.

2) Dopo aver eliminato le perdite di memoria, è necessario capire se il problema è che si stanno elaborando troppe richieste contemporaneamente. Non sono sicuro del modo migliore per farlo, ma se questo è il problema (o sospetti che lo sia), allora ci sono alcune possibili soluzioni:

  • Modifica la configurazione del server Tomcat per ridurre il numero di thread di lavoro.

  • Se le tue richieste sono vincolate all'I / O, allora un'altra possibilità sarebbe quella di esaminare il supporto per la gestione asincrona delle richieste disponibile nelle versioni recenti delle specifiche Servlet - vedi link . Ma quello sarà più lavoro.

3) Se il problema si verifica quando alcune richieste utilizzano troppa memoria, è necessario capire come rilevare le richieste in anticipo e "gestirle". Sia il rilevamento e la gestione di queste richieste potrebbe essere difficile ... ed è difficile da consigliare senza dettagli della vostra applicazione. Ma un paio di soluzioni pragmatiche sono:

  • Inoltra le richieste anomale a un altro server con un grande heap ... dove le OOME non interferiscono con le richieste "normali".

  • Aumenta la dimensione dell'heap. Se hai abbastanza memoria fisica, l'esecuzione con un heap più grande potrebbe effettivamente rendere i tuoi server Tomcat più efficienti ... oltre a evitare OOMEs.

In sintesi, provando piuttosto a caricare il bilanciamento per evitare OOME, ti suggerisco di capire perché stai ricevendo OOMEs ... e provare a gestire direttamente la causa di OOME.

    
risposta data 22.03.2014 - 07:24
fonte
0

Forse jvmtop vale la pena dare un'occhiata.

Ti mostra in modo "top-like" su una base per-jvm che monitora le metriche come il consumo di memoria, l'utilizzo della CPU, i conteggi dei thread ecc.

    
risposta data 14.03.2013 - 11:52
fonte

Leggi altre domande sui tag