Domanda

Ho un'applicazione web che funziona molto lentamente e ogni tanto si blocca. È un'app Wicket correlata alla scuola con reportistica e modifica e anche un servlet che viene utilizzato dai client automatizzati per ottenere / pubblicare dati tramite HTTPS.

Durante i periodi di grande affluenza in cui sono in corso molte operazioni di modifica / caricamento / download, l'app diventa lenta e non risponde. Ottengo Wicket " PageMap ancora bloccato " errori. Tomcat sembra continuare a ridere. L'utilizzo della memoria è gestibile, circa 50 M.

Ho configurato YourKit per ottenere alcune informazioni di profilazione e, durante un periodo intenso, ho scoperto che l'81% del tempo della CPU Tomcat viene impiegato qui:

org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run()
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(Object[])
org.apache.jk.common.ChannelSocket.processConnection(MsgContext)
org.apache.jk.common.ChannelSocket.receive(Msg, MsgContext)
org.apache.jk.common.ChannelSocket.read(MsgContext, byte[], int, int)
java.io.BufferedInputStream.read(byte[], int, int)
java.io.BufferedInputStream.read1(byte[], int, int)
java.io.BufferedInputStream.fill()
java.net.SocketInputStream.read(byte[], int, int)
[Wall Time]  java.net.SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int)

In questa app ho circa 250 client che eseguono il polling del server su SSL chiedendo aggiornamenti ogni 30 secondi. Il più delle volte, questo restituisce rapidamente una risposta vuota. Occasionalmente, c'è una raffica di attività di DB e un'intera serie di dati (alcuni MB) può essere rispedita al client.

Allora, da dove viene questa attività dell'81%? Alcuni client con connessioni molto lente potrebbero impantanare i thread Tomcat facendogli attendere i corpi delle richieste in arrivo?

Qualcuno ha visto qualcosa di simile o hai qualche consiglio su come testare / risolvere i problemi / risolvere questo problema?

È stato utile?

Soluzione

È necessario impostare un ambiente di prova e provare a riprodurlo con un test di carico.
In questo modo è possibile isolare la causa. Altrimenti ci sono troppi fattori.
Inoltre, in questo modo puoi provare le correzioni senza mettere a repentaglio il tuo prodotto.

Altri suggerimenti

L'uso della memoria è probabilmente la causa.
Dovresti controllare l'uso della memoria per il processo java per vedere quanto sta ottenendo.
Se non sta diventando abbastanza, devi impostare il parametro Xmx jvm ovunque siano impostati per tomcat.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top