VisualVM conta un thread come se utilizzasse il tempo della CPU ogni volta che la JVM pensa che sia eseguibile. Ciò significa che qualsiasi thread che non è in attesa di un blocco è considerato eseguibile, più o meno, inclusi i thread in attesa di I/O nel kernel! È qui che la grande quantità di utilizzo della CPU in com.myql.jdbc.utils.ReadAheadInputStream.fill()
viene da. Quindi, invece di un problema con la CPU, hai un problema di I/O.
Ci sono alcune cose che puoi fare sul lato JVM, ma non molte semplici ottimizzazioni:
- Modifica le dimensioni del pool di connessioni. 1.000 query simultanee sono un molto . A meno che la tua istanza MySQL non sia davvero massiccia, avrà problemi a gestire quel livello di carico e consumerà molto tempo semplicemente passando da una query all'altra. Prova a ridurre la dimensione della piscina, a 250 o anche a 50, e fai un benchmark lì.
- Fai meno o meno query. Se la tua app è piccola, potrebbe essere banalmente ovvio che ogni riga di ogni query è necessaria, ma forse la tua app è più grande di quella. Le diverse posizioni che eseguono query sugli stessi dati o possono essere combinate due query diverse in una che soddisferà entrambe?