VisualVM räknar en tråd som använder CPU-tid närhelst JVM tror att den är körbar. Detta innebär att alla trådar som inte väntar på ett lås anses körbara, mer eller mindre, inklusive trådar som väntar på I/O i kärnan! Det är här den stora mängden CPU-användning i com.myql.jdbc.utils.ReadAheadInputStream.fill()
kommer från. Så istället för ett CPU-problem har du ett I/O-problem.
Det finns några saker du kan göra på JVM-sidan, men inte mycket enkel optimering:
- Justera storleken på anslutningspoolen. 1 000 samtidiga frågor är en mängd . Om inte din MySQL-instans verkligen är massiv kommer den att få problem med att hantera den belastningsnivån och äta upp mycket tid på att bara växla mellan frågor. Försök att sänka poolstorleken till 250 eller till och med 50 och jämföra där.
- Gör färre eller mindre frågor. Om din app är liten kan det vara trivialt uppenbart att varje rad från varje fråga är nödvändig, men kanske din app är större än så. Är de olika platserna som frågar samma data, eller kan två olika frågor kombineras till en som uppfyller båda?