2016-05-03 59 views
6

Sto cercando di ottimizzare la mia applicazione principalmente per ridurre la "diffusione" dei tempi di risposta. La media va bene, ma l'intervallo è troppo ampio.Sintonizzazione JVM per alta velocità di allocazione

Dynatrace ha dimostrato che i tempi di risposta più elevati sono associati a una maggiore quantità di tempo trascorso in sospensione. Questo indica GC.

Ho provato a modificare alcuni valori di GC JVM basati sulla lettura online, con scarso successo.

In base ai log GC ho calcolato che il tasso di allocazione è di circa 324 MB/se il tasso di promozione è di soli 0,85 MB/s. A me sembra che abbia un tasso di allocazione molto alto, quindi ho cercato di aumentare le dimensioni della Young Generation.

Il primo screenshot è con impostazioni Java 8 predefinite, 1024 MB Xmx.

Il secondo screenshot sta impostando NewRatio = 1.

Qualsiasi suggerimento su cosa provare dopo sarebbe molto apprezzato.

Le cose che ho già provato: passaggio a G1GC, l'impostazione NewRatio = 1, impostando NewRatio = 1 e aumentando Xmx a 2048, l'impostazione newSize = 1600m e Xmx = 2048, l'impostazione MetaspaceSize = 100

Modifica: Aggiunta tronchi GC: http://pastebin.com/VhJwSuxv

Nota: Questi registri sono dalla prova 10min con il cambiamento: NewRatio = 1

enter image description here enter image description here

+1

* "Basato sui log GC" *, pubblicarli? – the8472

+0

Aggiunto collegamento a pastebin con i log del GC. Nota queste sono con la modifica: NewRatio = 1 – Bobby

+0

Le giovani collezioni offrono una pausa di 70-80 ms abbastanza coerente. Le vecchie raccolte richiedono più tempo, ma sono rare e ciò dovrebbe essere previsto quando si utilizza il raccoglitore della velocità effettiva. Quindi probabilmente dovresti ottenere più concretezza sulle misure di risposta per verificare che siano effettivamente correlate al GC. – the8472

risposta

3

Prima di accordare il GC, è necessario utilizzare un profiler di memoria per cercare di ridurre il tasso di allocazione in primo luogo.

Puoi provare ad aumentare ulteriormente la generazione giovane, ad es. è possibile impostare -Xmn2g -Xmx3g e non impostare NewRatio.

Ho capito l'assegnazione tasso da circa 324 MB/s,

Questo è il tasso moderato per un'applicazione web. Potrebbe essere più basso ma non mi aspetterei problemi significativi a questo livello.

Vorrei iniziare con un heap molto più grande a seconda della memoria della macchina, ad es. -Xmn24g -Xmx32g e guarda i tempi di pausa. Quindi riduci la dimensione dell'heap fino a quando non sembra avere un impatto sui tempi del GC (potrebbero anche accorciarsi).

Un altro modo di guardarlo; Potresti scoprire che è accettabile avere un GC secondario ogni 2-10 secondi. Ciò significa che si desidera uno spazio Eden da 650 MB a 3,2 GB.

+0

Grazie per la risposta. Puoi darmi un esempio di "memoria profiler" che suggerisci? Sto usando VisualVM. Non sono riuscito a far funzionare jstatd sul server remoto. Proverò con Xmn e Xmn molto più grandi che suggerisci. Ho provato con NewSize = 1600/Xmx = 2048 e questo ha ridotto la frequenza gc minore da 1s a 4s, tuttavia la durata di quei gc è durata circa 3 volte più a lungo, con un impatto negativo complessivo sul perf. – Bobby

+0

@Bobby Vorrei provare FlightRecorder. Questo può essere attivato dalla riga di comando e fornire molti più dettagli su ciò che l'applicazione sta facendo. –

+1

OK Ho provato il tuo suggerimento con heap molto più grande e diverse nuove dimensioni e ho raggiunto un risultato che offre un aumento delle prestazioni e una maggiore coerenza. Il prossimo sarà FlightRecorder. Grazie ancora per le risposte! – Bobby