21 · Concurrency, request rate và kiểu đến của request
Nguồn: fanout.sh / inference-eng / 04-02 · ~6 phút
Ghi chú
Cách bạn tạo tải (bao nhiêu request cùng lúc, bao nhiêu mỗi giây, và chính xác chúng đến lúc nào) thay đổi mọi con số bạn đo, nên hai team có thể báo TTFT tuyệt vời và phần đuôi tệ hại trên cùng một server. Một vòng kín (closed loop) (concurrency cố định) chậm lại cùng với server; một vòng hở (open loop) (rate cố định) cứ tiếp tục đến và để lộ hàng đợi mà người dùng thật cảm nhận. Định luật Little nối hai cái: số đang xử lý = rate × thời gian trong hệ thống (4 req/s × 6 s = 24). Cùng 10 req/s trên một server bận 80%, P99 thời gian chờ đi từ 0 → 0,9 s → 2,7 s khi chuyển từ kiểu đến đều sang Poisson sang dồn cục. Thời gian trong hệ thống tăng theo 1 ÷ (1 − utilization): 2×, 5×, 10×, 20× ở 50, 80, 90, 95%. Đó là điểm gãy.
1. Vòng kín so với vòng hở
- Concurrency cố định (vòng kín): ví dụ 8 người dùng ảo, mỗi người gửi, chờ câu trả lời, rồi gửi lại ngay. Luôn có đúng 8 request đang xử lý.
- Request rate (vòng hở): request đến theo lịch, ví dụ 10 mỗi giây, dù các request trước đã xong hay chưa.
Khi server chậm lại, vòng kín gửi ít hơn (người dùng của nó đang chờ), nên không có gì dồn lại. Vòng hở cứ tiếp tục đến và hàng đợi lớn dần.
Quan trọng
Người dùng internet thật hành xử như vòng hở. Một bài test vòng kín có thể che giấu đúng phần xếp hàng mà người dùng của bạn sẽ cảm nhận.
2. Định luật Little
Mỗi giây có 4 request đến và mỗi cái mất 6 s từ đầu tới cuối, nên trung bình có 24 request đang xử lý. Đảo lại: 32 request đang xử lý, mỗi cái 6 s, nghĩa là phục vụ ≈ 5,3 req/s.
- Nó chuyển đổi qua lại giữa bài test concurrency và bài test rate.
- Nó cảnh báo bạn: nếu request đến nhanh hơn tốc độ hoàn thành, thời gian trong hệ thống cứ tăng mãi, và đám đông cũng vậy.
3. Các kiểu đến
Cùng trung bình, khác thời điểm.
| Kiểu | Trông như | Mô hình hoá |
|---|---|---|
| Đều (uniform) | Cứ 100 ms một cái, như máy đếm nhịp | Gần như không có lưu lượng thật nào |
| Poisson | Độc lập, ngẫu nhiên: có cặp, có khoảng trống | Nhiều người dùng độc lập |
| Dồn cục (bursty) | Từng cụm | Batch job, một tính năng bỗng nổi tiếng; công cụ benchmark dùng phân phối gamma với burstiness < 1 |
Đưa cả ba vào cùng một server mô phỏng: 80 ms mỗi request ở 10 req/s, tức bận 80% thời gian.
Đều thì không bao giờ phải chờ. Poisson: trung bình 166 ms, P99 0,9 s. Dồn cục: trung bình 636 ms, P99 2,7 s.
Quan trọng
Cùng tải trung bình: chỉ riêng kiểu đến đã làm phần đuôi thay đổi 3 lần.
4. Điểm gãy
Trong một hàng đợi đơn giản, thời gian trong hệ thống so với thời gian phục vụ thuần tăng theo 1 ÷ (1 − utilization).
Thoai thoải ở nửa tải, dựng đứng khi gần đầy tải.
- Server LLM có batching, nên năng lực giãn ra khi tải tăng, nhưng chúng vẫn chạm cùng điểm gãy đó khi batch hoặc KV cache đầy.
Thận trọng
Một GPU bận 99% không phải là hiệu quả: đó là một hàng đợi chực chờ bùng nổ.
5. Cách tạo tải

Benchmark của vLLM có đúng các núm chỉnh này:
vllm bench serve \
--request-rate 10 \
--burstiness 0.5 \
--max-concurrency 646. Tóm tắt
