VisualVM tæller en tråd som at bruge CPU-tid, når JVM'en mener, den kan køres. Dette betyder, at enhver tråd, der ikke venter på en lås, anses for at kunne køres, mere eller mindre, inklusive tråde, der venter på I/O i kernen! Det er her den store mængde CPU-brug i com.myql.jdbc.utils.ReadAheadInputStream.fill()
kommer fra. Så i stedet for et CPU-problem har du et I/O-problem.
Der er nogle ting, du kan gøre på JVM-siden, men ikke en masse ligetil optimering:
- Tweak størrelsen på forbindelsespuljen. 1.000 samtidige forespørgsler er en masse . Medmindre din MySQL-instans virkelig er massiv, vil den få problemer med at håndtere det belastningsniveau og æde en masse tid på bare at skifte mellem forespørgsler. Prøv at sænke poolstørrelsen til 250 eller endda 50, og benchmark der.
- Foretag færre eller mindre forespørgsler. Hvis din app er lille, kan det være trivielt indlysende, at hver række fra hver forespørgsel er nødvendig, men måske er din app større end det. Er de forskellige steder, der forespørger om de samme data, eller kan to forskellige forespørgsler kombineres til én, der tilfredsstiller begge?