WRK là gì? Hiểu Load Testing & so sánh với các tool tương tự
🚀 WRK LÀ GÌ? HIỂU LOAD TESTING & SO SÁNH VỚI CÁC TOOL TƯƠNG TỰ
Khi xây dựng Backend, câu hỏi không chỉ là:
“API có chạy được không?”
Mà còn:
“API chịu được bao nhiêu request?”
“Khi có 1.000–2.000 concurrent connections thì chuyện gì xảy ra?”
“Bottleneck nằm ở API, CPU, Database hay Redis?”
👉 wrk là một công cụ HTTP benchmarking rất nhẹ và mạnh, thường được dùng để kiểm tra performance của API.
1. wrk là gì?
wrk là HTTP benchmarking tool dùng để tạo lượng lớn HTTP request tới server và đo performance.
Nó có thể giúp bạn quan sát:
- Requests/sec
- Latency
- Throughput
- Concurrent connections
- Khả năng chịu tải của API
Có thể hình dung:
WRK
│
┌─────────┼─────────┐
│ │ │
Request Request Request
│ │ │
└─────────┼─────────┘
▼
┌──────────────┐
│ Spring Boot │
│ API │
└──────────────┘
Mục đích chính của wrk:
Tạo tải → đo performance → tìm bottleneck.
2. Câu lệnh cơ bản
Ví dụ:
wrk http://localhost:1122/ticket/1/detail/1
Load test thực tế:
wrk -t12 -c2000 -d2m \
http://localhost:1122/ticket/1/detail/1
Trong đó:
wrk
│
├── -t12
│ └── 12 worker threads
│
├── -c2000
│ └── 2000 concurrent connections
│
├── -d2m
│ └── chạy 2 phút
│
└── URL
└── API cần test
3. -t, -c, -d khác nhau thế nào?
-t12
-t12
Tạo 12 worker threads cho wrk.
-c2000
-c2000
Duy trì tối đa 2.000 concurrent connections.
⚠️ Không có nghĩa là 2.000 requests/second.
-d2m
-d2m
Chạy test trong 2 phút.
Ví dụ:
-d10s
-d30s
-d2m
-d5m
4. wrk đo được gì?
Sau khi chạy:
wrk -t12 -c2000 -d2m http://localhost:1122/ticket/1/detail/1
Bạn sẽ nhận được các thông tin như:
Thread Stats
Latency
Requests/sec
Transfer/sec
Latency
Thời gian API trả response.
50ms
100ms
200ms
500ms
1s
Requests/sec
Số request xử lý được mỗi giây.
Ví dụ:
Requests/sec: 3500
Có thể hiểu là benchmark đạt khoảng 3.500 requests/second trong điều kiện test đó.
5. wrk có phải là 2.000 RPS không?
Không.
wrk -t12 -c2000 -d2m ...
nghĩa là:
12 worker threads
+
2000 concurrent connections
+
2 minutes
Không phải:
2000 requests/sec
RPS thực tế phụ thuộc vào:
API
│
├── Business logic
├── Database
├── Redis
├── CPU
├── Memory
├── Network
└── Connection Pool
6. Diagram Load Test + Monitoring
Khi kết hợp wrk với Spring Boot + Prometheus + Grafana:
LOAD TEST
│
▼
┌─────────────┐
│ wrk │
│ │
│ 12 threads │
│ 2000 conn. │
└──────┬──────┘
│
HTTP Requests
│
▼
┌─────────────────┐
│ Spring Boot │
│ :1122 │
└────────┬────────┘
│
Metrics
│
▼
┌─────────────────┐
│ Prometheus │
└────────┬────────┘
│
PromQL
│
▼
┌─────────────────┐
│ Grafana │
└─────────────────┘
│
▼
📊 RPS / Latency
📊 Error Rate
📊 CPU / Memory
📊 JVM Threads
7. Những tool nào tương tự wrk?
wrk không phải công cụ duy nhất để load test HTTP API.
Một số tool phổ biến:
wrk
│
├── ApacheBench (ab)
├── hey
├── wrk2
├── k6
├── Gatling
├── JMeter
└── Locust
Tuy nhiên, chúng có mục đích và mức độ phức tạp khác nhau.
8. So sánh wrk với các tool khác
| Tool | Điểm mạnh | Phù hợp |
|---|---|---|
| wrk | Rất nhẹ, nhanh, đơn giản | HTTP benchmark |
| wrk2 | Giữ target request rate ổn định | Constant-RPS testing |
| hey | Cực kỳ đơn giản, dễ dùng | Quick API load test |
| ApacheBench (ab) | Cổ điển, dễ sử dụng | Basic HTTP benchmark |
| k6 | Script bằng JavaScript, metrics tốt | API/load testing hiện đại |
| JMeter | GUI, nhiều protocol, nhiều tính năng | Complex load testing |
| Gatling | Code-based, hiệu năng tốt | Performance testing |
| Locust | Python scripting, user behavior | User-flow/load testing |
9. wrk vs hey
wrk
wrk -t12 -c2000 -d2m http://localhost:1122/api
hey
hey -n 10000 -c 200 http://localhost:1122/api
hey rất dễ bắt đầu.
Ví dụ:
hey
│
├── -n 10000 → tổng số requests
└── -c 200 → concurrent requests
Trong khi wrk thiên về benchmark throughput trong một khoảng thời gian.
👉 Nếu muốn test nhanh một API:
hey
👉 Nếu muốn benchmark HTTP server mạnh hơn:
wrk
10. wrk vs wrk2
wrk2 được xây dựng dựa trên ý tưởng của wrk nhưng tập trung vào constant throughput / constant request rate.
Điểm khác biệt quan trọng:
wrk
│
└── "Server xử lý được bao nhiêu?"
Trong khi:
wrk2
│
└── "Tôi muốn ép server nhận X requests/sec,
server phản ứng thế nào?"
Ví dụ concept:
wrk
───────────────
Load càng nhanh
→ RPS phụ thuộc khả năng server
wrk2
───────────────
Target = 1000 req/s
→ cố gắng duy trì 1000 req/s
Điều này hữu ích khi nghiên cứu latency dưới một mức tải cố định.
11. wrk vs k6
Đây là một comparison rất đáng chú ý.
wrk
wrk -t12 -c2000 -d2m http://localhost:1122/api
Rất nhanh và đơn giản.
Nhưng khi scenario phức tạp hơn thì command line không còn đủ.
k6
Có thể viết test bằng JavaScript:
import http from "k6/http";
export default function () {
http.get("http://localhost:1122/api");
}
Sau đó định nghĩa load scenario:
0 users
↓
100 users
↓
500 users
↓
1000 users
↓
500 users
↓
0 users
Ví dụ concept:
Users
1000 │ ┌───────┐
│ / \
500 │ / \
│ / \
0 └──────────────────────────
0 1m 2m 3m
k6 phù hợp hơn khi bạn muốn mô phỏng behavior/scenario, còn wrk rất phù hợp cho benchmark HTTP đơn giản và nhanh.
12. wrk vs JMeter
JMeter có cách tiếp cận khác.
JMeter
│
├── GUI
├── HTTP
├── Database
├── FTP
├── JMS
├── Assertions
├── Reports
└── Complex scenarios
Bạn có thể xây dựng:
Login
↓
Get Product
↓
Add Cart
↓
Checkout
↓
Payment
Trong khi wrk thường phù hợp hơn với:
GET /products
GET /product/1
POST /orders
và benchmark từng endpoint.
Trade-off
wrk
Complexity ──► thấp
Performance ──► rất cao
JMeter
Complexity ──► cao
Features ──► rất nhiều
13. wrk vs Gatling
Gatling thiên về code-based performance testing.
Bạn có thể mô tả scenario:
User
│
├── Login
│
├── Browse products
│
├── Add cart
│
└── Checkout
Sau đó chạy với nhiều virtual users.
Gatling phù hợp khi performance test trở thành một phần của automated testing / CI/CD.
14. wrk vs Locust
Locust sử dụng Python để mô phỏng hành vi user.
Ví dụ:
User
│
├── Login
├── Search
├── View Product
├── Add Cart
└── Checkout
Thay vì chỉ:
GET /product/1
Bạn có thể mô phỏng cả user journey.
Điểm mạnh:
Locust
│
└── Python
↓
User behavior
15. Chọn tool nào?
Có thể nhớ bằng bảng này:
| Bạn muốn… | Tool phù hợp để xem xét |
|---|---|
| Benchmark API cực nhanh | wrk |
| Test HTTP đơn giản | hey |
| Benchmark HTTP cơ bản | ApacheBench |
| Test constant RPS | wrk2 |
| Viết load test bằng JS | k6 |
| GUI + scenario phức tạp | JMeter |
| Performance test bằng code | Gatling |
| Mô phỏng user behavior bằng Python | Locust |
Không có một tool duy nhất phù hợp cho mọi bài toán; lựa chọn phụ thuộc vào việc bạn cần benchmark một endpoint, giữ RPS cố định, hay mô phỏng cả user journey.
16. Với project Spring Boot của bạn
Nếu mục tiêu hiện tại là học:
Spring Boot + Redis + MySQL + Prometheus + Grafana + Performance
thì có thể đi theo flow:
┌─────────────┐
│ wrk │
└──────┬──────┘
│
Load API
▼
┌────────────────┐
│ Spring Boot │
└───────┬────────┘
│
┌────────┴────────┐
▼ ▼
Redis MySQL
│ │
└────────┬────────┘
│
Metrics
▼
┌────────────┐
│ Prometheus │
└─────┬──────┘
│
▼
┌─────────┐
│ Grafana │
└─────────┘
Sau đó thử các bài test:
Test 1
100 connections
↓
Measure RPS + Latency
Test 2
500 connections
↓
Measure RPS + Latency
Test 3
1000 connections
↓
Measure RPS + Latency
Test 4
2000 connections
↓
Measure RPS + Latency
Rồi so sánh:
100 500 1000 2000
│ │ │ │
RPS │ │ │ │
Latency │ │ │ │
CPU │ │ │ │
Memory │ │ │ │
DB │ │ │ │
Redis │ │ │ │
Errors │ │ │ │
👉 Đây là lúc wrk trở nên rất hữu ích: không chỉ biết API chạy được, mà còn quan sát được hệ thống thay đổi như thế nào khi tải tăng lên.
🧠 Một câu để nhớ
wrk= nhanh, nhẹ, tập trung vào HTTP benchmark.
k6/JMeter/Gatling/Locust= nhiều khả năng hơn để xây dựng các load-test scenario phức tạp.