Bạn muốn biết API của mình hoạt động như thế nào ở đúng 500 yêu cầu/giây, thay vì “nhanh nhất có thể với N luồng”. Vegeta phù hợp cho trường hợp này: bạn đặt tốc độ yêu cầu cố định, Vegeta gửi đúng tốc độ đó và báo cáo độ trễ, throughput, mã trạng thái, lỗi để bạn đánh giá SLO ở mức tải mục tiêu.
Vegeta là gì
Vegeta là công cụ kiểm thử tải HTTP dòng lệnh được viết bằng Go. Nó cũng có thể dùng như thư viện Go, nhưng bài viết này tập trung vào CLI.
Điểm quan trọng của Vegeta là mô hình tải theo tốc độ cố định:
100 requests/second trong 30 seconds
Nếu server phản hồi chậm, Vegeta vẫn tiếp tục gửi request mới theo lịch. Điều này giúp bạn mô phỏng lưu lượng thực tế tốt hơn trong các bài kiểm thử cần đo:
- Throughput tại một mức tải cụ thể.
- Latency percentile như p95, p99.
- Tỷ lệ lỗi khi nhu cầu vượt quá khả năng xử lý.
- Hành vi của API tại một ngưỡng SLO cụ thể.
Tải theo tốc độ và tải theo số lượng kết nối đồng thời
Có hai mô hình phổ biến khi kiểm thử tải.
Mô hình đóng: cố định số user hoặc connection
Các công cụ dựa trên số lượng user ảo hoặc thread thường chạy theo vòng lặp:
send request -> wait response -> send next request
Nếu server chậm, vòng lặp chậm theo. Kết quả là tốc độ request thực tế giảm xuống. Điều này có thể che giấu nghẽn cổ chai vì công cụ vô tình giảm tải khi hệ thống bắt đầu quá tải.
Mô hình mở: cố định tốc độ request
Vegeta dùng mô hình mở:
send 500 requests/second regardless of previous responses
Nếu server không theo kịp:
- Request xếp hàng.
- Latency tăng.
- Error rate có thể tăng.
- Báo cáo phản ánh đúng điểm quá tải.
Không có mô hình nào “đúng tuyệt đối”. Hãy chọn theo câu hỏi bạn cần trả lời:
- Muốn biết “bao nhiêu user đồng thời?” → dùng mô hình đồng thời.
- Muốn biết “API ra sao ở 2.000 request/giây?” → dùng Vegeta.
Nếu bạn cần so sánh thêm các công cụ khác, xem các công cụ kiểm thử tải API hàng đầu.
Cài đặt Vegeta
Chọn cách cài phù hợp với hệ điều hành của bạn.
macOS với Homebrew
brew update && brew install vegeta
Các trình quản lý gói khác
# MacPorts
port install vegeta
# Arch Linux
pacman -S vegeta
# FreeBSD
pkg install vegeta
Build từ source
Yêu cầu đã cài Go.
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
Bạn cũng có thể tải binary đã biên dịch sẵn từ trang release trên GitHub.
Kiểm tra cài đặt:
vegeta --help
Chạy bài kiểm thử đầu tiên
Luồng cơ bản của Vegeta gồm 3 bước:
target -> attack -> report
Ví dụ tối thiểu:
echo "GET http://localhost:8080/" | vegeta attack -duration=5s -rate=100 | vegeta report
Lệnh trên thực hiện:
-
echotạo một target gồm method và URL. -
vegeta attackgửi 100 request/giây trong 5 giây. -
vegeta reportđọc kết quả và in báo cáo.
Tổng số request dự kiến:
100 requests/second * 5 seconds = 500 requests
Bạn cũng có thể viết rõ đơn vị thời gian:
-rate=100/1s
-rate=50/500ms
Lưu ý: -rate=0 không có nghĩa là 0 request. Nó bỏ giới hạn tốc độ và gửi nhanh nhất có thể. Đây là kiểu kiểm thử khác với kiểm thử tải cố định.
Đọc báo cáo Vegeta
Một báo cáo văn bản có dạng:
Requests [total, rate, throughput] 500, 100.20, 100.18
Duration [total, attack, wait] 4.991s, 4.990s, 1.2ms
Latencies [min, mean, 50, 90, 95, 99, max] 412us, 1.3ms, 1.1ms, 1.9ms, 2.4ms, 5.1ms, 12ms
Bytes In [total, mean] 128500, 257.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:500
Error Set:
Khi đọc báo cáo, hãy ưu tiên theo thứ tự:
Success [ratio]Status CodesError SetLatenciesRequests [throughput]
Các cột latency quan trọng:
| Cột | Ý nghĩa |
|---|---|
50 |
Median/p50, một nửa request nhanh hơn giá trị này |
90 |
p90 |
95 |
p95, thường dùng trong SLO |
99 |
p99, phần đuôi chậm nhất mà người dùng dễ cảm nhận |
max |
Request chậm nhất |
Ví dụ: nếu mean thấp nhưng 99 cao, API vẫn có vấn đề ở phần đuôi latency.
Lưu kết quả để phân tích lại
Không nên chỉ pipe trực tiếp vào report nếu bạn cần so sánh hoặc lưu artifact CI.
Hãy ghi kết quả thô ra file:
echo "GET http://localhost:8080/" | \
vegeta attack -duration=10s -rate=200 -output=results.bin
Tạo báo cáo text:
vegeta report results.bin
Tạo JSON để dùng trong dashboard hoặc CI:
vegeta report -type=json results.bin > metrics.json
Tạo histogram latency:
vegeta report -type='hist[0,2ms,5ms,10ms,25ms,100ms]' results.bin
Histogram giúp bạn thấy request tập trung ở dải latency nào, thay vì chỉ nhìn một số trung bình.
Tạo file target cho API thực tế
API thực tế thường có nhiều endpoint, nhiều method và body. Hãy đưa target vào file.
Tạo targets.txt:
GET http://localhost:8080/api/users
POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json
GET http://localhost:8080/api/users/42
Tạo payload.json:
{ "name": "Ada", "role": "engineer" }
Chạy test:
vegeta attack -targets=targets.txt -rate=50 -duration=30s | vegeta report
Quy tắc định dạng target:
- Dòng đầu tiên của mỗi target là
METHOD URL. - Header nằm ngay bên dưới, mỗi dòng một
Key: Value. - Dòng bắt đầu bằng
@trỏ đến file body. - Dòng trống phân tách các target.
- Dòng bắt đầu bằng
#là comment.
Vegeta sẽ lặp qua các target theo thứ tự cho đến khi hết thời gian chạy.
Thêm header xác thực
Với API cần token, dùng -header:
vegeta attack -targets=targets.txt -rate=50 -duration=30s \
-header="Authorization: Bearer $TOKEN" | vegeta report
Bạn có thể export token trước khi chạy:
export TOKEN="your-access-token"
Cách này tiện khi chạy trong CI/CD vì token có thể lấy từ secret manager hoặc biến môi trường.
Dùng target JSON
Vegeta cũng hỗ trợ target dạng JSON. Mỗi dòng là một object JSON.
Ví dụ:
{"method": "GET", "url": "http://localhost:8080/api/users"}
{"method": "POST", "url": "http://localhost:8080/api/users", "header": {"Content-Type": ["application/json"]}, "body": "eyJuYW1lIjoiQWRhIn0="}
Chạy với -format=json:
vegeta attack -format=json -targets=targets.json -rate=100 -duration=30s | vegeta report
Trường body phải được mã hóa base64.
Ví dụ tạo base64 body:
echo -n '{"name":"Ada"}' | base64
Định dạng JSON phù hợp khi bạn muốn generate target tự động từ script hoặc dữ liệu test.
Vẽ biểu đồ latency
Báo cáo text không phải lúc nào cũng đủ. Nếu latency tăng dần trong quá trình test, bạn nên xem theo chuỗi thời gian.
Tạo biểu đồ HTML:
vegeta attack -targets=targets.txt -rate=100 -duration=60s | \
vegeta plot > plot.html
Mở file:
open plot.html
Hoặc trên Linux:
xdg-open plot.html
Bạn cũng có thể so sánh nhiều mức tải:
vegeta attack -rate=50 -duration=30s -targets=targets.txt -output=50qps.bin
vegeta attack -rate=100 -duration=30s -targets=targets.txt -output=100qps.bin
vegeta plot 50qps.bin 100qps.bin > compare.html
Nếu môi trường không có GUI, xuất CSV:
vegeta encode -to=csv results.bin > results.csv
Sau đó bạn có thể đưa vào spreadsheet, Grafana, notebook hoặc tool phân tích nội bộ.
Quy trình kiểm thử gợi ý
Một workflow thực tế với Vegeta có thể như sau:
- Chọn endpoint hoặc luồng API cần đo.
- Tạo file
targets.txt. - Chạy smoke test ở tốc độ thấp.
- Tăng dần
-rate. - Lưu mỗi lần chạy vào file
.bin. - Tạo report JSON/text.
- So sánh p95, p99, success ratio và status code.
- Xác định ngưỡng bắt đầu lỗi hoặc latency tăng mạnh.
Ví dụ chạy nhiều mức tải:
for rate in 50 100 200 500; do
vegeta attack \
-targets=targets.txt \
-rate=${rate} \
-duration=60s \
-output=results-${rate}qps.bin
vegeta report results-${rate}qps.bin > report-${rate}qps.txt
vegeta report -type=json results-${rate}qps.bin > report-${rate}qps.json
done
So sánh biểu đồ:
vegeta plot results-50qps.bin results-100qps.bin results-200qps.bin results-500qps.bin > compare.html
Khi nào nên dùng Vegeta
Dùng Vegeta khi bạn cần trả lời các câu hỏi về tốc độ và dung lượng:
- API giữ được p95/p99 bao nhiêu ở 500 request/giây?
- Tốc độ nào bắt đầu làm latency tăng mạnh?
- Khi nào xuất hiện lỗi 5xx?
- Bản build mới có chậm hơn bản cũ dưới cùng một tải không?
- Cấu hình hạ tầng A và B khác nhau thế nào ở cùng mức QPS?
Vegeta phù hợp với kiểm thử tải HTTP có thể script hóa và chạy trong CLI/CI.
Nó không phù hợp nếu bạn cần:
- Mô phỏng hành trình người dùng phức tạp với nhiều nhánh logic.
- Kiểm tra nội dung response chi tiết.
- Validate schema hoặc business rule.
- Tạo kịch bản browser-level.
Nếu bạn đang so sánh với công cụ khác, xem thêm kiểm thử tải k6 và kiểm thử tải JMeter. Với nền tảng khái niệm và chỉ số, xem hướng dẫn kiểm thử hiệu năng API.
Kiểm thử chức năng nằm ở đâu
Kiểm thử tải trả lời câu hỏi:
API có đủ nhanh không?
Nó không trả lời câu hỏi:
API có trả về dữ liệu đúng không?
Một endpoint có thể trả về HTTP 200 rất nhanh nhưng dữ liệu bên trong sai. Với Vegeta, request đó vẫn được tính là thành công nếu status code hợp lệ.
Vì vậy, trước khi chạy tải, bạn nên có bước kiểm thử chức năng để xác nhận:
- Status code.
- Header.
- JSON field.
- Schema.
- Business rule.
- Dữ liệu trả về.
Đó là vai trò của kiểm thử chức năng.
Apidog bổ trợ cho Vegeta theo hướng này: dùng Apidog để xác nhận API trả về đúng dữ liệu, sau đó dùng Vegeta để đo API đó còn nhanh không khi bị gọi hàng trăm hoặc hàng nghìn lần mỗi giây.
Chạy Apidog CLI trước Vegeta trong CI
Apidog cung cấp CLI không đầu để chạy kiểm thử chức năng trong pipeline.
Cài bằng Node:
npm install -g apidog-cli
Chạy scenario hoặc suite đã lưu:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
Trong đó:
-
-t: ID scenario, folder hoặc suite. -
-e: ID environment. -
-r: reporter, ví dụcli,html,json,junit.
Output junit phù hợp với hầu hết CI dashboard.
Ví dụ pipeline đơn giản:
# 1. Functional gate
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t "$APIDOG_SUITE_ID" \
-e "$APIDOG_ENV_ID" \
-r cli,junit
# 2. Load test only if functional tests pass
vegeta attack \
-targets=targets.txt \
-rate=200 \
-duration=60s \
-output=results.bin
# 3. Export reports
vegeta report results.bin
vegeta report -type=json results.bin > vegeta-report.json
Xem thêm hướng dẫn dòng lệnh Apidog CLI và hướng dẫn pipeline CI/CD.
Câu hỏi thường gặp
Vegeta có hỗ trợ POST với body không?
Có. Trong file target HTTP, đặt method và URL ở dòng đầu tiên, thêm header Content-Type, sau đó tham chiếu file body bằng @.
POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json
Với target JSON, dùng trường body được mã hóa base64.
-rate=0 có tác dụng gì?
-rate=0 bỏ giới hạn tốc độ và gửi request nhanh nhất có thể theo khả năng của worker và connection.
Dùng nó khi bạn muốn kiểm thử thông lượng tối đa. Nếu cần kết quả có thể lặp lại ở một mức tải cụ thể, hãy đặt -rate rõ ràng, ví dụ:
-rate=100
-rate=500
-rate=1000
Nên đọc percentile latency thế nào?
Tập trung vào p95 và p99.
- p50 cho biết trải nghiệm trung vị.
- p95 cho biết phần lớn người dùng có trải nghiệm thế nào.
- p99 cho biết phần đuôi chậm, thường là nơi vấn đề hiệu năng xuất hiện.
Mean thấp không đảm bảo hệ thống tốt nếu p99 cao.
Vegeta có kiểm tra response body đúng không?
Không. Vegeta đo:
- Throughput.
- Latency.
- Status code.
- Error.
Nó không validate nội dung response hoặc schema. Hãy kết hợp với công cụ kiểm thử chức năng trước khi chạy tải.
Làm sao chạy Vegeta trong CI?
Vegeta là một binary dòng lệnh, nên bạn có thể chạy trong bất kỳ shell step nào.
Ví dụ:
vegeta attack \
-targets=targets.txt \
-rate=300 \
-duration=60s \
-output=results.bin
vegeta report results.bin > vegeta-report.txt
vegeta report -type=json results.bin > vegeta-report.json
Lưu results.bin, vegeta-report.txt và vegeta-report.json làm artifact để so sánh giữa các build. Chạy kiểm thử chức năng trước, sau đó mới chạy Vegeta để chỉ đo các endpoint đã vượt qua xác nhận.
Top comments (0)