Riduzione della latenza dell’applicazione Java

Miglioramento della latenza dell'applicazione Java

Uno dei problemi complessi e ambigui con cui mi sono confrontato nella mia carriera di sviluppo di applicazioni era migliorare la latenza per un’applicazione di recupero dati distribuita.

Era un’applicazione Java containerizzata utilizzata per servire annunci di prodotti su uno dei più grandi siti web di vendita al dettaglio. L’idea era ridurre la latenza in modo da poter apportare modifiche al processo, soprattutto per eseguire esperimenti con modelli avanzati di apprendimento automatico per offrire annunci migliori ai clienti.

Una delle tecniche che ho utilizzato è stata l’analisi della memoria per ottenere informazioni sull’attività legata all’utilizzo della memoria JVM. Sebbene possa sembrare banale, ho scoperto ostacoli significativi che mi hanno richiesto del tempo per risolvere. Alla fine, sono riuscito a superare ognuno di essi e a ridurre con successo la latenza p99 dell’applicazione da 400 ms a 240 ms.

La riduzione della latenza era una sfida nuova per me, quindi avevo bisogno di strumenti ottimali per affrontarla. Potevo scegliere tra molti strumenti disponibili, sia open source che a pagamento, ma ho trovato che l’eclipse memory analysis tool MAT fosse il più utile tra quelli gratuiti. Ci sono molti articoli su come installare e utilizzare MAT, quindi non entrerò nei dettagli in questa sede.

In questo articolo, affronterò le sfide legate all’analisi della memoria delle grandi applicazioni in produzione e come superarle.

Sfide

  1. La dimensione dell’heap memory JVM delle grandi applicazioni è piuttosto grande e, nel mio caso, era di circa 100 GB. Analizzare un heap dump così grande richiede molta memoria per eseguire lo strumento di analisi ed è solitamente lento sui laptop comuni.
  2. Gli heap dump di grandi dimensioni consumano una quantità equivalente di spazio su disco. Nel caso in cui non ci sia abbastanza spazio su disco, il comando di heap dump fallirà o nel peggiore dei casi riempirà la partizione root e farà crashare l’host su cui viene eseguito.
  3. Un heap dump è un evento di “stop-the-world”. Prendere un heap dump mette in pausa tutte le attività dell’applicazione, il che può comportare un fallimento del controllo di integrità del servizio e la sua terminazione, rendendo difficile acquisire il file di heap dump.

Soluzione

  1. In caso di heap dump di grandi dimensioni, sarebbe meglio utilizzare una risorsa basata su cloud come AWS EC2 con una quantità sufficiente di memoria e spazio su disco.
  2. Per risolvere i problemi di spazio su disco, se l’applicazione è in esecuzione su una risorsa cloud, di solito è dotata di uno spazio di archiviazione separato. Lo spazio di archiviazione separato può essere aumentato prima di effettuare un heap dump.
  3. Verificare se l’applicazione viene monitorata utilizzando un controllo periodico di integrità, ad esempio se fa parte di un bilanciatore di carico. In tal caso, è necessario rimuoverla dal gruppo di server per evitare che venga terminata una volta avviato il comando di heap dump.
  4. Eseguire più heap dump a intervalli regolari per catturare i cambiamenti nello stato del servizio.

Miglioramenti

  1. Uno dei maggiori responsabili era una cache in memoria, che comportava un’heap retention eccessiva, con conseguente frequente garbage collection e impatto sulla latenza.
  2. L’analisi della memoria ha fornito importanti indicazioni su come veniva utilizzato l’indice dei dati, utilizzato per il recupero dei dati. Si è scoperto che l’intero indice veniva caricato nell’heap JVM ed era anche archiviato su tmpfs, utilizzando quindi il doppio della quantità di memoria richiesta, il che era superfluo e comportava anche una frequente garbage collection.

Conclusioni

Analizzare la memoria di qualsiasi applicazione su larga scala in produzione è fondamentale.

La memorizzazione nella cache dei dati all’interno di un’applicazione può essere utile ma deve essere monitorata attentamente per rilevare eventuali degradazioni nel tempo.

L’analisi degli heap dump è uno strumento potente. Se effettuata utilizzando le macchine e gli strumenti corretti, può essere difficoltosa.

Prestare attenzione ai controlli di integrità delle applicazioni in produzione durante il prelievo degli heap dump per raccoglierli correttamente.

Non sono entrato troppo nei dettagli per mantenere l’articolo breve. Se qualcuno desidera ulteriori informazioni, può contattarmi liberamente.