2014-10-07 8 views
5

Ho un'applicazione java servlet su Java 7 che è normalmente molto salutare in termini di consumo di risorse di sistema. Normalmente l'utilizzo della CPU sul server è inferiore al 50%. Tuttavia nei pochi minuti successivi all'avvio si comporta in modo molto diverso, al punto che la CPU può diventare ancorata al 100% per diversi minuti se tenta di servire molto traffico durante quel periodo. Il risultato sono tempi di risposta lenti, timeout di rete e anche lunghe pause di raccolta dati inutili.Compilatore C2 saturazione CPU all'avvio

Per diagnosticare il problema, ho eseguito una serie di discariche di thread mentre il server si stava avviando e ho eseguito il massimo -H allo stesso tempo. Abbinando ciascun thread java a un pid, posso vedere costantemente lo C2 CompilerThread che utilizza di gran lunga la maggior parte della CPU. Ho fatto ricerche su ciò che questo thread fa e capisco che si tratta di un compilatore Java che ottimizza il codice basato sulle statistiche runtime. Ma da tutta la lettura che ho fatto, non posso dire l'approccio migliore per migliorare la situazione. Le uniche opzioni che può ricavare sono:

  1. Passa dalla C2 alla TieredCompiler (ma sarà questo risultato in una migliore performance nei primi minuti dopo l'avvio?)
  2. Accendere -XX: + PrintCompilation di vedere ciò che è ottimizzato (ma cosa devo fare con queste informazioni? Posso forzare l'ottimizzazione prima che il server accetti il ​​traffico?)

Qual è l'approccio migliore da prendere e ci sono altre opzioni da provare e alleviare Utilizzo della CPU dopo l'avvio?

+2

Una volta scoperto dove sta andando la compilazione del codice, guarda come ridurlo. Questo potrebbe significare rimuovere una libreria che è particolarmente costosa. IMHO non è normale avere un po 'di codice che il C2 deve utilizzare per lunghi periodi di tempo. –

+0

Grazie. Ci ho provato ma non sono sicuro di cosa sto cercando. Solo i metodi più frequentemente compilati? O metodi etichettati "made zombie" o "made not entrant"? Non c'è niente di ovvio che mi salti addosso. – Cameron

+0

Quali pacchetti compilano il maggior numero di metodi I. E. Da quale barattolo muore, viene questo? –

risposta

0

Esistono diverse tecnologie JVM a pagamento per alleviare il problema, utilizzando la compilazione in anticipo.

Tuttavia, se si desidera attenersi alle JVM standard, l'utilizzo di un trucco personale è dopo l'avvio che si inviano alcune richieste fittizie in modo che la JVM venga riscaldata prima dell'avvio effettivo dell'operazione. In questo modo puoi decidere quando vuoi pagare il costo di riscaldamento della JVM prima di servire i tuoi clienti.

È possibile anche forzare la JVM di compilare tutto il codice da -Xcomp opzioni della riga di comando per hotspot, ma noi non lo consiglio in quanto rallenta l'avvio dell'applicazione mediante la compilazione di rado codice usato.