VisualVM đếm một luồng khi sử dụng thời gian CPU bất cứ khi nào JVM cho rằng nó có thể chạy được. Điều này có nghĩa là bất kỳ luồng nào không đợi trên khóa đều được coi là có thể chạy được, dù ít hay nhiều, bao gồm cả các luồng đang chờ I / O trong nhân! Đây là nơi có lượng CPU sử dụng lớn trong com.myql.jdbc.utils.ReadAheadInputStream.fill()
là đến từ. Vì vậy, thay vì sự cố CPU, bạn có sự cố I / O.
Có một số điều bạn có thể làm ở phía JVM, nhưng không có nhiều cách tối ưu hóa đơn giản:
- Điều chỉnh kích thước nhóm kết nối. 1.000 truy vấn đồng thời là một lô . Trừ khi phiên bản MySQL của bạn thực sự lớn, nó sẽ gặp khó khăn khi xử lý mức tải đó và ngốn rất nhiều thời gian chỉ để chuyển đổi giữa các truy vấn. Hãy thử giảm kích thước hồ bơi xuống 250 hoặc thậm chí 50 và lấy điểm chuẩn ở đó.
- Thực hiện ít hơn hoặc các truy vấn nhỏ hơn. Nếu ứng dụng của bạn nhỏ, điều hiển nhiên là mọi hàng từ mọi truy vấn đều cần thiết, nhưng có thể ứng dụng của bạn lớn hơn thế. Các địa điểm khác nhau có truy vấn cùng một dữ liệu hay hai truy vấn khác nhau có thể được kết hợp thành một để đáp ứng cả hai không?