VisualVM zählt einen Thread so, als würde er CPU-Zeit verwenden, wenn die JVM denkt, dass er lauffähig ist. Das bedeutet, dass jeder Thread, der nicht auf eine Sperre wartet, mehr oder weniger als lauffähig betrachtet wird, einschließlich Threads, die im Kernel auf I/O warten! Hier liegt die große Menge an CPU-Auslastung in com.myql.jdbc.utils.ReadAheadInputStream.fill()
kommt aus. Anstelle eines CPU-Problems haben Sie also ein I/O-Problem.
Es gibt einige Dinge, die Sie auf der JVM-Seite tun können, aber nicht viele einfache Optimierungen:
- Optimieren Sie die Größe des Verbindungspools. 1.000 gleichzeitige Abfragen sind viel . Wenn Ihre MySQL-Instanz nicht wirklich massiv ist, wird sie Probleme haben, dieses Lastniveau zu bewältigen, und viel Zeit verschlingen, wenn Sie nur zwischen Abfragen wechseln. Versuchen Sie, die Poolgröße auf 250 oder sogar 50 zu verringern, und führen Sie dort einen Benchmark durch.
- Führen Sie weniger oder kleinere Abfragen durch. Wenn Ihre App klein ist, ist es vielleicht trivial offensichtlich, dass jede Zeile aus jeder Abfrage erforderlich ist, aber vielleicht ist Ihre App größer. Sind die verschiedenen Stellen, die dieselben Daten abfragen, oder können zwei verschiedene Abfragen zu einer kombiniert werden, die beide erfüllt?