Chắc hạn đã nghe đâu đó hoặc đã view 1 số chart p99, p98, p95,…
Vậy bạn có thắc mắc chúng ta gì không?
Tại sao nó lại qua trọng đối với hầu hết sản phẩm
Chúng ta cùng nhau đến với 1 ví dụ:
Visual example of P99 latency
Hãy tưởng tượng bạn đang xếp hàng 100 người chờ thanh toán ở siêu thị.
– P50 (median): Người đứng giữa hàng (thứ 50) rời quầy sau 3 giây.
– P95: 95 người đầu đã xong trong 4 giây; chỉ còn 5 người chậm hơn.
– P99: 99 người đầu hoàn tất trong 5 giây; chỉ duy nhất 1 người phải đợi lâu hơn.
| Percentile | Giới hạn thời gian (s) | Ý nghĩa thực tế |
|---|---|---|
| P50 | ≈3.5 s | Một nửa các lần quét kết thúc ≤3.5 s – mức “bình thường” |
| P95 | ≈4 s | 95% lượt quét xong ≤4 s – thỉnh thoảng mới chậm |
| P99 | ≈5 s | 99% lượt quét kết thúc ≤5 s – chỉ 1% hiếm hoi vượt mốc này |
Như vậy, khi bạn đặt alert P99 >5 s, nghĩa là:
-> Nếu cứ 100 lần quét, có hơn 1 lần mất quá 5 giây, hãy cảnh báo – hệ thống đang xuất hiện latency “long tail” cần điều tra.
Đưa ví dụ “100 người xếp hàng” giúp người xem hình dung ngay rằng P99 không đại diện cho toàn bộ người dùng, nhưng lại rất nhạy để phát hiện những trải nghiệm tệ hại hiếm gặp.
Vậy làm sao để tạo ra được metrics và tính toán P99
total_scan_time_seconds_bucket{le="0.005",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.01",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.025",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.05",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.1",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.25",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.5",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="0.75",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="1",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="1.5",pool="HIGH"} 0 1753779929424
total_scan_time_seconds_bucket{le="2",pool="HIGH"} 9 1753779929424
total_scan_time_seconds_bucket{le="2.5",pool="HIGH"} 10 1753779929424
total_scan_time_seconds_bucket{le="3",pool="HIGH"} 11 1753779929424
total_scan_time_seconds_bucket{le="3.5",pool="HIGH"} 11 1753779929424
total_scan_time_seconds_bucket{le="4",pool="HIGH"} 27 1753779929424
total_scan_time_seconds_bucket{le="4.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="5.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="6",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="6.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="7",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="7.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="8",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="8.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="9",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="9.5",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="10",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_bucket{le="+Inf",pool="HIGH"} 48 1753779929424
total_scan_time_seconds_sum{pool="HIGH"} 168.58599999999998 1753779929424
total_scan_time_seconds_count{pool="HIGH"} 48 1753779929424
Dữ liệu chủng ta đang có là histogram của Prometheus với hai trường đặc trưng:
- …_bucket: số bản ghi rơi vào từng “xô” (le = “less-or-equal”).
- …_sum và …_count: tổng thời gian và số mẫu, dùng để tính trung bình, p-quantile, v.v.
1. Hiểu nhanh cấu trúc metric
| Trường | Ý nghĩa |
|---|---|
| total_scan_time_seconds_bucket{le=”2″} 9 | Có 9 lần quét hoàn thành ≤2 s |
| total_scan_time_seconds_count 48 | Tổng 48 lần quét |
| total_scan_time_seconds_sum 168.586 | Tổng thời gian 168.586 s |
Grafana sẽ tự tính rate/ increase nếu bạn cung cấp chuỗi thời gian thô; tuy nhiên ở đây bạn chỉ hướng dẫn hiển thị phân bố độ trễ (ví dụ p50, p90, p99).
2. Truy vấn PromQL chuẩn bị cho biểu đồ
Độ trễ trung bình
avg by (pool)(
rate(total_scan_time_seconds_sum[5m])
/
rate(total_scan_time_seconds_count[5m])
)
Đôi khi total scan time nó vượt các bucket chỉ định và tất cả đi vào Bucket Inf
Bạn thấy các bucket chỉ định lớn nhất minh đang set là dưới 10s

Nếu mà có quá nhiều total scan time lớn hơn 10s thì nó sẽ đi vào inf.
Và bạn sẽ thấy p99, p95, p50 đều là 10s

Chúng ta vẫn muốn biết total scan time trung bình tại

Tiếp theo chúng ta sẽ chart P99

Nếu như bạn muốn vẽ chart này thì nghĩa là bạn đang muốn trong 1 khoảng thời gian chỉ định thì P99 là bao nhiêu. Kiểu như là trước 1h, chiều hôm qua thì câu promQL như sau:
Tình huống:
Phân phối P99 “tính gộp” trên toàn dải thời gian lọc (ví dụ toàn khung thời gian dashboard)
histogram_quantile(0.99, sum(increase(total_scan_time_seconds_bucket{cluster_name="$cluster", pool="NORMAL"}[$__range])) by (le))
Nếu bạn muốn theo dõi tại thời điểm nào đó trong qua khứ P99 là bao nhiêu bạn có thể sử dụng:
histogram_quantile(
0.99,
sum(
rate(total_scan_time_seconds_bucket{cluster_name="$cluster"}[5m])
) by (le, pool)
)
