Bài viết thuộc series “Chinh phục Prometheus”
Giới thiệu
Trong bài trước, chúng ta đã tìm hiểu cách thu thập các thông số cần thiết để giám sát máy chủ, tuy nhiên chúng chỉ là dữ liệu thô. Vì vậy, trong bài này, chúng ta sẽ tìm hiểu công thức để tính toán các giá trị hữu ích từ dữ liệu thô đó cho người dùng.
Áp dụng phương pháp USE
Từ phương pháp USE đã nói ở bài trước, các giá trị ta cần tính toán cho CPU là: CPU Utilization và CPU Saturation.
CPU Utilization
CPU Utilization là một chỉ số đo lường tỉ lệ thời gian CPU sử dụng để thực hiện các tác vụ của hệ thống so với tổng thời gian hoạt động của CPU trong một khoảng thời gian nhất định. Nó được tính bằng phần trăm và thường được sử dụng để đánh giá hiệu suất hoạt động của hệ thống. Nếu tỉ lệ này quá cao, có thể dẫn đến tình trạng quá tải CPU và ảnh hưởng đến hoạt động của hệ thống.
Metric mà Node Exporter thu thập về cho CPU Utilization là node_cpu_seconds_total
, để kiểm tra ta truy cập địa chỉ http://localhost:9090/graph
và gõ vào node_cpu_seconds_total{}
.
Giá trị của một metric như sau:
node_cpu_seconds_total{cpu="0", instance="10.0.2.15:9100", job="node", mode="idle"}
- Hai labels
instance
vàjob
giúp xác định metric này được thu thập từ đâu - Label
cpu
chỉ định thứ tự core của CPU trong máy chủ, ví dụ ta hay nghe CPU có 2 core hay 4 core - Label
mode
là chế độ của CPU như: user, system, idle, …
Đây là dữ liệu thô và khi nhìn vào ta cũng không hình dung được gì nhiều về tình trạng hiện tại của máy chủ. Ta cần chuyển nó sang các giá trị hữu ích cho người giám sát, ví dụ như phần trăm CPU được sử dụng trong vòng 5 phút, hay còn được gọi là CPU Utilization. Công thức để tính được giá trị CPU Utilization như sau:
100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100
Tiếp theo ta tìm hiểu chi tiết về công thức trên, để tính được CPU Utilization đầu tiên ta cần tính per-second rate của CPU. Prometheus PromQL cung cấp hàm irate
để tính giá trị trên, ví dụ ta tính tỷ lệ trong vòng 5 phút:
irate(node_cpu_seconds_total{}[5m])
Kết quả nó trả về là danh sách per-second rate theo CPU và Mode trong vòng 5 phút.
Sau đó ta tổng hợp các giá trị này theo Instance:
avg(irate(node_cpu_seconds_total{}[5m])) by (instance)
Tuy nhiên số này hiện tại không có ý nghĩa gì cả, mà ta cần thêm vào công thức trên mode=idle
.
Lý do là vì CPU Mode idle là trạng thái mà CPU đang không thực hiện bất kỳ tác vụ xử lý nào và chờ đợi để nhận các yêu cầu xử lý tiếp theo. CPU Mode idle thường được sử dụng để đo lường tài nguyên dư thừa của hệ thống và giúp phát hiện các sự cố trong hệ thống.
Nên để tính được tài nguyên CPU đang được sử dụng, ta sẽ lấy tổng tài nguyên của CPU (100) trừ đi cho tài nguyên đang ở trạng thái idle
. Phần trăm tài nguyên đang ở trạng thái idle
:
avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100
Phần trăm CPU đang được sử dụng (CPU Utilization):
100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100
Bấm qua Graph ta sẽ thấy kết quả trực quan hơn. Thông thường ta không dùng Prometheus để xem các giá trị này mà ta sẽ dùng Grafana.
CPU Saturation
CPU Saturation là một chỉ số đo lường mức độ sử dụng của CPU so với khả năng xử lý tối đa của nó. Nó đo lường mức độ quá tải của CPU bằng cách so sánh số lượng yêu cầu xử lý hiện tại với khả năng xử lý tối đa của CPU. Nếu CPU Saturation cao, nghĩa là CPU đang được sử dụng gần đạt mức giới hạn và có thể gây ra hiện tượng treo máy hoặc giảm hiệu suất hệ thống. Đây là một chỉ số quan trọng tuy nhiên rất ít bạn quan tâm hoặc biết tới.
Metric mà Node Exporter thu thập về cho CPU Saturation là node_load*
. Với dấu *
có các giá trị là 1, 5, 15 tương ứng với 1 phút, 5 phút và 15 phút. Ví dụ CPU Saturation trong vòng 1 phút:
node_load1{}
Đối với CPU Saturation ta không dùng giá trị của nó để xem mà ta dùng nó để thiết lập thông báo. Ví dụ chỉ số CPU Saturation trong vòng 1 phút lớn hơn số lượng CPU có trên máy chủ:
node_load1 > count by (instance)(node_cpu_seconds_total{mode="idle"})
Nếu có nhiều Instance thì các bạn thêm on()
vào:
node_load1 > on(instance) count by (instance)(node_cpu_seconds_total{mode="idle"})
Khi giá trị này bằng true
thì tương ứng với việc CPU gần quá tải và ta sẽ dùng Alertmanager để bắn thông báo cho người quản trị.
Kết luận
Vậy là ta đã tìm hiểu xong cách để tính toán hai chỉ số quan trọng cho CPU. Với chỉ số CPU Utilization ta thường dùng cho việc quan sát (bằng Grafana) và CPU Saturation ta dùng cho việc bắn thông báo (bằng Alertmanager). Ở bài tiếp theo ta sẽ tìm hiểu về Memory Utilization và Saturation.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?