Skip to content

Hướng dẫn đo hiệu năng bằng tool wrk

Mục lục

  1. Phương pháp test tải API và công cụ wrk
  2. Cài đặt wrk trên API
  3. 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)

  1. Cài đặt một số package cần thiết của wrk
sudo apt-get install build-essential libssl-dev git -y
  1. Clone source code của wrk về:

    git clone https://github.com/wg/wrk.git wrk
    

  2. 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
    

  3. 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