Latency Percentiles and Throughput Fundamentals

Tran Van Ngoc|

TL;DR

  • Bản chất: Throughput (Ops/sec hoặc RPS) đo tốc độ xử lý khối lượng công việc của hệ thống trên một đơn vị thời gian. Latency Percentiles (p50,p90,p95,p99p50, p90, p95, p99) đo phân bố thời gian phản hồi thực tế của từng nhóm người dùng, phản ánh rủi ro Tail Latency mà số trung bình (Mean/Average) hoàn toàn che giấu.
  • Mục đích: p50p50 (Median) đại diện cho trải nghiệm người dùng phổ thông. p95p95 và p99p99 là tiêu chuẩn vàng để cam kết SLA/SLO (Service Level Agreement/Objective), bảo vệ nhóm khách hàng chịu độ trễ tồi tệ nhất.
  • Điểm mấu chốt: Không bao giờ dùng Số trung bình (Average) để đánh giá hiệu năng API vì 1%1\% request bị nghẽn (ví dụ: Stop-The-World Garbage Collection, Lock Contention, Disk I/O) sẽ bị số lượng lớn request nhanh làm lu mờ. Trong kiến trúc Microservices, nếu p99p99 của một service con chậm, toàn bộ request tổng hợp của người dùng sẽ bị kéo chậm theo quy tắc xác suất nhị thức.

Core Concept

1. Throughput: Đơn vị Đo lường Khối lượng Công việc

  • Throughput (Thông lượng): Số lượng thao tác (Operations) hoặc yêu cầu (Requests) mà hệ thống hoàn tất thành công trong một giây.
  • Đơn vị:
    • RPS (Requests Per Second): Dùng cho Web API / HTTP Server.
    • QPS (Queries Per Second): Dùng cho Database (PostgreSQL, MySQL).
    • Ops/sec (Operations Per Second): Dùng cho Benchmark thuật toán, CPU, Cache Redis, Disk I/O.
  • Mối quan hệ Little’s Law trong Hệ thống Hàng đợi: L=λ×WL = \lambda \times W Trong đó:
    • LL: Số lượng request đang nằm trong hệ thống (Concurrency / In-flight requests).
    • λ\lambda: Throughput (RPS).
    • WW: Latency trung bình (Response time).
    • Ý nghĩa thực chiến: Nếu Latency WW tăng gấp 10 lần (do nghẽn DB), để duy trì cùng một Throughput λ\lambda, hệ thống bắt buộc phải giữ số lượng kết nối đồng thời LL gấp 10 lần → Dẫn đến cạn kiệt Connection Pool và tràn RAM.

2. Bẫy Số Trung Bình (The Flaw of Averages)

Giả sử kiểm thử 100 requests với kết quả thời gian phản hồi:

  • 99 requests phản hồi siêu tốc: 10ms10\text{ms}.
  • 1 request bị dính Lock Timeout hoặc Garbage Collection: 10,000ms10,000\text{ms} (1010 giây).

Tính số trung bình (Mean / Average): Average Latency=(99×10)+(1×10,000)100=990+10,000100≈109.9ms\text{Average Latency} = \frac{(99 \times 10) + (1 \times 10,000)}{100} = \frac{990 + 10,000}{100} \approx 109.9\text{ms}

👉 Hậu quả: Con số 109.9ms109.9\text{ms} nhìn có vẻ “khá tốt”, nhưng nó hoàn toàn che giấu sự thật rằng có khách hàng đã phải đứng chờ tới 1010 giây và có thể đã bỏ giỏ hàng!


3. Latency Percentiles: p50,p90,p95,p99p50, p90, p95, p99

Để nhìn thấy sự thật, ta sắp xếp toàn bộ NN thời gian phản hồi theo thứ tự tăng dần từ bé đến lớn:

[10ms, 10ms, 12ms, 15ms, ..., 45ms, ..., 120ms, ..., 3500ms]
  │                            │          │            │
  ▼                            ▼          ▼            ▼
p50 (Trung vị)                p90        p95          p99 (Đuôi dài - Tail)
  • p50p50 (50th Percentile / Median - Trung vị):
    • 50%50\% số lượng requests có thời gian phản hồi nhỏ hơn hoặc bằng giá trị này.
    • Phản ánh trải nghiệm của nhóm người dùng thông thường trong điều kiện lý tưởng.
  • p90p90 (90th Percentile):
    • 90%90\% requests phản hồi nhanh hơn mốc này. 10%10\% còn lại bắt đầu chậm hơn.
  • p95p95 (95th Percentile - Chuẩn SLA Tiêu biểu):
    • 95%95\% requests hoàn tất dưới mốc này. Chỉ có 5%5\% người dùng gặp độ trễ cao hơn.
    • Mức cam kết tiêu chuẩn cho hầu hết các API ứng dụng thương mại điện tử và tài chính.
  • p99p99 (99th Percentile - Tail Latency / Worst Case):
    • Mốc thời gian mà 99%99\% requests nhanh hơn, và đại diện cho 1%1\% requests tồi tệ nhất.
    • Tại sao p99p99 lại sống còn?
      • 1%1\% người dùng thường là những tài khoản lớn (Power Users: giỏ hàng nhiều sản phẩm nhất, lịch sử giao dịch dài nhất, đại lý mua sỉ khối lượng lớn).
      • Trong kiến trúc Microservices, một trang chủ gọi 50 service con song song. Xác suất để người dùng dính phải ít nhất một service bị dính p99p99 là: P=1−(1−0.01)50≈1−0.605=39.5%P = 1 - (1 - 0.01)^{50} \approx 1 - 0.605 = 39.5\% Nghĩa là gần 40%40\% người dùng sẽ phải chịu độ trễ của p99p99!

Bảng So sánh Ma trận Đo lường

Chỉ sốÝ nghĩa kỹ thuậtHiện tượng gây raMục tiêu tối ưu
Throughput (RPS)Số lượng công việc hoàn tất/giâyQuá tải CPU, nghẽn I/O, bão hòa băng thôngCàng cao càng tốt
p50p50 LatencyTrải nghiệm người dùng thông thườngTốc độ xử lý code thuần túy, truy vấn index chuẩn<20ms< 20\text{ms}
p95p95 LatencyNgưỡng cam kết SLA chính thứcHàng đợi Connection Pool, tranh chấp tài nguyên nhẹ<100ms< 100\text{ms}
p99p99 LatencyĐuôi trễ cực đoan (Tail Latency)Stop-The-World GC, Row-Level Lock Contention, Disk Flush WAL<500ms< 500\text{ms}

Practical Implementation

Đọc Báo cáo k6 Performance Benchmark

     ✓ status is 200

     checks.........................: 100.00% ✓ 1500      ✗ 0
     http_req_duration..............: avg=32.4ms min=8.1ms med=18.2ms max=890.5ms p(90)=42.1ms p(95)=68.4ms p(99)=185.2ms
     http_reqs......................: 1500    99.82/s
  • http_reqs: Đạt thông lượng xấp xỉ 100 RPS100\text{ RPS} (Requests Per Second).
  • med (p50p50): 18.2ms18.2\text{ms} (Người dùng bình thường nhận kết quả cực nhanh).
  • p(95): 68.4ms68.4\text{ms} (Đạt cam kết SLA dưới 100ms100\text{ms}).
  • p(99): 185.2ms185.2\text{ms} và max: 890.5ms890.5\text{ms} (Cảnh báo: Có hiện tượng nghẽn nhẹ do tranh chấp khóa cơ sở dữ liệu ở nhóm 1%1\% cuối cùng).