Hướng dẫn đo hiệu năng bằng tool wrk
Mục lục
- Phương pháp test tải API và công cụ wrk
- Cài đặt wrk trên API
- Sử dụng wrk để đo hiệu năng API
Phương pháp test tải API và công cụ wrk
Có nhiều phương pháp test tải của một API hoặc một trang web. Test tải tức là kiểm tra nhiều thông tin của dịch vụ như: - Trong một giây dịch vụ có thể phục vụ được bao nhiêu yêu cầu truy cập. - Tốc độ phản hồi trung bình của dịch vụ - Số ượng phản hồi thành công, thất bại, timeout,... - ... (Nhiều thông số khác)
Để thực hiện test tải như trên, cần một số công cụ để giả lập - mô phỏng hàng trăm, hàng nghìn đến hàng chục nghìn máy tính ảo đồng loạt gửi truy cập trong một khoảng thời gian cố định. Có nhiều công cụ hỗ trợ khả năng như: ApacheBench, Apache JMeter, wrk,... Trong đó, hướng dẫn này tập trung xung quanh công cụ tên là wrk - một công cụ mã nguồn mở. (https://github.com/wg/wrk)
wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scalable event notification systems such as epoll and kqueue.
Cài đặt wrk trên API (trên Ubuntu)
- Cài đặt một số package cần thiết của wrk
sudo apt-get install build-essential libssl-dev git -y
-
Clone source code của wrk về:
git clone https://github.com/wg/wrk.git wrk
-
Cài đặt công cụ wrk bằng lệnh
make
, sau đó copy vào thư mục /usr/local/bin để chạy được tool trên bash.(cd wrk) sudo make sudo cp wrk /usr/local/bin
-
Kiểm tra cài đặt thành công hay không bằng lệnh.
wrk --help
Nếu thành công, sẽ hiển thị như sau:
Sử dụng wrk để đo hiệu năng API
Các tham số cần truyền vào phía sau lệnh wrk lần lượt như sau:
-c, --connections: total number of HTTP connections to keep open with
each thread handling N = connections/threads
-d, --duration: duration of the test, e.g. 2s, 2m, 2h
-t, --threads: total number of threads to use
-s, --script: LuaJIT script, see SCRIPTING
-H, --header: HTTP header to add to request, e.g. "User-Agent: wrk"
--latency: print detailed latency statistics
--timeout: record a timeout if a response is not received within
this amount of time.
Vậy để tiến hành test tải bằng wrk, ta chạy một số lệnh như sau:
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
Có nghĩa là chạy benchmark với thời lượng 30 giây, dùng 12 threads và giữ cùng lúc 400 HTTP Connecction. Kết quả wrk trả về có dạng:
Running 30s test @ http://127.0.0.1:8080/index.html
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 635.91us 0.89ms 12.92ms 93.69%
Req/Sec 56.20k 8.07k 62.00k 86.54%
22464657 requests in 30.00s, 17.76GB read
Requests/sec: 748868.53
Transfer/sec: 606.33MB
Quan sát nội dung wrk trả về, wrk đã tạo ra tổng cộng 22464657 yêu cầu truy cập dịch vụ trong 30s, truyền hơn 17.7Gb dữ liệu qua api. Ta thấy dịch vụ có thể đáp ứng 748868 request/giây --> Một số thống kê độ trễ và tốc độ trung bình, độ lệch chuẩn, giá trị tối đa, v.v...
[Mở rộng ] Test tải yêu cầu dạng POST có body JSON
Tạo một tệp tin đuôi *.lua
theo format như sau:
wrk.method = "POST"
wrk.body = "{"question": "phương thức xét tuyển là gì"}"
wrk.headers["Content-Type"] = "application/json"
Sau đó, test tải bằng lệnh wrk với tham số cần dùng là -s, --script và theo sau đó là tệp tin .lua
:
Ví dụ như sau:
wrk -t12 -c400 -d30s -s post.lua http://127.0.0.1:8080/index.html