Mysql
 sql >> Database >  >> RDS >> Mysql

Mysql jconnector trascorre il 50% del tempo in com.myql.jdbc.utils.ReadAheadInputStream.fill()

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:

  1. 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ì.
  2. 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?