Jennifer Monitoring And Profiles
Jennifer Monitoring And Profiles
Mục tiêu
Jennifer là công cụ APM được sử dụng để trả lời hai câu hỏi quan trọng:
- Hệ thống đang hoạt động như thế nào?
- Tại sao hệ thống lại hoạt động như vậy?
Nhiều người chỉ theo dõi TPS hoặc CPU rồi kết luận nguyên nhân.
Trên thực tế phần lớn sự cố hiệu năng đều cần kết hợp nhiều chỉ số khác nhau để có cái nhìn chính xác.
Hai chức năng quan trọng
Monitoring
Monitoring trả lời:
Hệ thống đang xảy ra chuyện gì?
Các chỉ số thường được sử dụng:
- TPS
- Response Time
- Active Service
- JVM Heap
- Garbage Collection
- CPU Usage
- Memory Usage
Monitoring cho phép xác định:
- Thời điểm bắt đầu xảy ra sự cố
- Mức độ nghiêm trọng
- Xu hướng tăng giảm của tải hệ thống
Profiles
Profiles trả lời:
Thành phần nào đang gây ra vấn đề?
Monitoring cho thấy triệu chứng.
Profiles cho thấy nguyên nhân.
Ví dụ:
- SQL nào chậm
- Service nào chậm
- External Call nào chậm
- Hàm nào chiếm nhiều thời gian
Các chỉ số quan trọng nhất
TPS
Transaction Per Second.
Số lượng request xử lý trong một giây.
Ví dụ:
TPS = 50
có nghĩa hệ thống đang xử lý khoảng 50 request mỗi giây.
Lưu ý
TPS thấp không đồng nghĩa hệ thống khỏe.
Ví dụ:
TPS = 57
Active Thread = 100
Response Time = 622ms
Trong trường hợp này hệ thống vẫn có thể đang nghẽn.
Response Time
Thời gian phản hồi trung bình.
Ví dụ:
100ms
thường được xem là khá tốt với các giao dịch thông thường.
Khi Response Time tăng đột biến:
100ms
→ 300ms
→ 600ms
→ 1000ms
thì cần xác định nguyên nhân ngay.
Active Service
Đây là chỉ số quan trọng nhất khi điều tra nghẽn.
Active Service thể hiện:
Có bao nhiêu request đang được xử lý tại thời điểm hiện tại.
Nếu TPS không tăng nhiều nhưng Active Service tăng liên tục:
TPS = 50
Active Service
20
40
70
100
150
thì thường có dấu hiệu nghẽn ở đâu đó.
Active Thread
Cho biết số lượng thread đang hoạt động.
Ví dụ:
Thread Pool = 100
Active Thread = 100
Điều này có nghĩa:
- Toàn bộ thread đều đang bận
- Request mới phải chờ
Đây là tín hiệu rất đáng chú ý.
Quy trình điều tra sự cố
Bước 1
Xác định thời điểm phát sinh vấn đề.
Ví dụ:
14:20
Người dùng bắt đầu phản ánh chậm.
Bước 2
Xem Monitoring.
Quan sát:
- TPS
- Response Time
- Active Service
- Active Thread
Ví dụ:
TPS = 57
Response Time = 622ms
Active Thread = 100
Active Service = 100
Bước 3
Mở Profiles.
Cần trả lời:
Thread đang làm gì?
chứ không phải:
Thread đang có bao nhiêu?
Bước 4
Tìm service chiếm nhiều thời gian nhất.
Ví dụ:
AccountService
Tổng thời gian:
45%
Đây là ứng viên đầu tiên cần điều tra.
Bước 5
Phân tích chi tiết.
Thông thường thời gian sẽ nằm ở:
- SQL
- External Call
- File IO
- Lock
Phân tích SQL
Dấu hiệu:
Response Time tăng
TPS không tăng
Thread tăng
Khi mở Profile thường thấy:
SQL
70%
hoặc cao hơn.
Lúc đó cần kiểm tra:
- Execution Plan
- Missing Index
- Full Table Scan
- Wait Event
Phân tích External Call
External Call thường là nguyên nhân khó phát hiện.
Ví dụ:
A
|
→ B
|
→ C
Ứng dụng A không gặp lỗi.
Nhưng hệ thống C phản hồi chậm.
Kết quả:
Thread của A bị giữ lại.
Từ bên ngoài chỉ nhìn thấy:
TPS thấp
Response Time cao
Điều nên theo dõi
- URL gọi đi
- Thời gian gọi
- Tỷ lệ timeout
- Tỷ lệ lỗi
Trường hợp thực tế
Case
Dữ liệu thu thập:
Active Service = 100
Active Thread = 100
TPS = 57
Response Time = 622ms
Nhận định ban đầu
TPS không cao.
Tuy nhiên:
Thread Pool Full
cho thấy nút thắt không nằm ở số lượng request.
Các nguyên nhân khả nghi
SQL
Một hoặc nhiều query chạy quá lâu.
External Call
Hệ thống downstream phản hồi chậm.
Lock
Nhiều thread cùng chờ một tài nguyên.
Deadlock
Một nhóm thread chờ lẫn nhau.
Những sai lầm phổ biến
Chỉ nhìn CPU
CPU thấp không có nghĩa hệ thống khỏe.
Nhiều hệ thống nghẽn do chờ IO.
Chỉ nhìn TPS
TPS thấp không có nghĩa hệ thống rảnh.
TPS thấp đôi khi là hậu quả của việc hệ thống đang kẹt.
Chỉ nhìn Response Time
Response Time là kết quả cuối cùng.
Nguyên nhân thực sự thường nằm bên dưới.
Checklist Điều Tra Nhanh
Khi có phản ánh chậm:
- Xác định thời gian xảy ra sự cố
- Xem TPS
- Xem Response Time
- Xem Active Service
- Xem Active Thread
- Mở Profile
- Kiểm tra SQL
- Kiểm tra External Call
- Thu thập Thread Dump
- Xác định thành phần giữ thread lâu nhất
Lessons Learned
Monitoring giúp phát hiện vấn đề.
Profiles giúp xác định nguyên nhân.
Khi Active Thread đạt tối đa cấu hình, điều quan trọng nhất không phải là tăng thêm thread mà là tìm ra thành phần đang giữ thread quá lâu.
Trong phần lớn trường hợp production thực tế, nguyên nhân cuối cùng thường nằm ở:
- SQL chậm
- External Call chậm
- Lock cạnh tranh tài nguyên
chứ hiếm khi do thiếu thread đơn thuần.