VisualVM compte un thread comme utilisant du temps CPU chaque fois que la JVM pense qu'il est exécutable. Cela signifie que tout thread n'attendant pas de verrou est considéré comme exécutable, plus ou moins, y compris les threads en attente d'E/S dans le noyau ! C'est là que la grande quantité d'utilisation du processeur dans com.myql.jdbc.utils.ReadAheadInputStream.fill()
vient de. Ainsi, au lieu d'un problème de CPU, vous avez un problème d'E/S.
Il y a certaines choses que vous pouvez faire du côté JVM, mais pas beaucoup d'optimisation simple :
- Ajustez la taille du pool de connexions. 1 000 requêtes simultanées, c'est beaucoup . À moins que votre instance MySQL ne soit vraiment massive, elle aura du mal à gérer ce niveau de charge et prendra beaucoup de temps à basculer entre les requêtes. Essayez de réduire la taille du pool à 250, voire 50, et comparez-la.
- Effectuez des requêtes moins nombreuses ou plus petites. Si votre application est petite, il peut être évident que chaque ligne de chaque requête est nécessaire, mais peut-être que votre application est plus grande que cela. Les différents lieux interrogent-ils les mêmes données, ou deux requêtes différentes peuvent-elles être combinées en une seule qui satisfasse les deux ?