AB Benchmarking Tool - Bài test cuối cùng sau khi triển khai Rest API

Nội dung bài viết

Video học lập trình mỗi ngày

Cách kiểm tra Server chịu tải bao nhiêu requests trong x thời gian

Sau khi hoàn thành viết một webservices hay còn gọi là rest api thì anh em chúng ta tiến hàng test và đánh giá. Xong khâu này thì đến lúc thử nghiệm trong môi trường thật. Thực tế trong cuộc sống thì khi một đôi giày được sản xuất ra thì việc kiểm tra trong môi trường nóng nhất và lạnh nhất phải được thực hiện để check xem độ bền của đôi giày thế nào?

Tương tự phần mềm cũng vậy, chúng ta phải test xem liệu hệ thống của chúng ta chịu tải được bao nhiêu lượng truy cập đồng thời - concurrency. Có nhiều tools để làm việc này và hoàn hảo nhất thì bạn nên xem video thực tế này. Nodejs có thể chịu tải được 100k/s test với 100 users đồng thời ? Cách đó sử dụng Autocannon.

Nếu như các bạn không chịu khó tìm hiểu về # Autocannon. Thì dưới đây là một các dễ hơn nhiều. Đó là sử dụng AB Benchmarking Tool.

Install AB Benchmarking in CentOS Ubuntu macOS

Đầu tiên nếu bạn đang xài macOS thì bạn không cần Install AB Benchmarking bởi vì mặc định đã có trong hệ điều hành này rồi. Ngoài ra nếu các bạn xài hệ điều hành Ubuntu hay CentOS thì có thể install theo lệnh dưới đây:

  • CentOS: yum install httpd-tools
  • Ubuntu: apt-get install apache2-utils

    Như vậy đã xong, tiếp đến hay xem cách sử dụng AB Benchmarking như thế nào.

Hướng dẫn sử dụng AB Benchmarking Tool

Nói về cú pháp thì như sau:

> ab [options] <IP hoặc Domain>:<port><path>

Trong đó [options] có rất nhiều sự lựa chọn. Tham khảo thêm khi bạn chạy lệnh sau: ab -v.

Options are:
    -n requests     Number of requests to perform
    -c concurrency  Number of multiple requests to make at a time
    -t timelimit    Seconds to max. to spend on benchmarking
                    This implies -n 50000
    -s timeout      Seconds to max. wait for each response
                    Default is 30 seconds
    -b windowsize   Size of TCP send/receive buffer, in bytes
    -B address      Address to bind to when making outgoing connections
    -p postfile     File containing data to POST. Remember also to set -T
    -u putfile      File containing data to PUT. Remember also to set -T
    -T content-type Content-type header to use for POST/PUT data, eg.
                    'application/x-www-form-urlencoded'
                    Default is 'text/plain'
    -v verbosity    How much troubleshooting info to print
    -w              Print out results in HTML tables
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                    Inserted after all normal header lines. (repeatable)
    -A attribute    Add Basic WWW Authentication, the attributes
                    are a colon separated username and password.
    -P attribute    Add Basic Proxy Authentication, the attributes
                    are a colon separated username and password.
    -X proxy:port   Proxyserver and port number to use
    -V              Print version number and exit
    -k              Use HTTP KeepAlive feature
    -d              Do not show percentiles served table.
    -S              Do not show confidence estimators and warnings.
    -q              Do not show progress when doing more than 150 requests
    -l              Accept variable document length (use this for dynamic pages)
    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served
    -r              Don't exit on socket receive errors.
    -m method       Method name
    -h              Display usage information (this message)
    -I              Disable TLS Server Name Indication (SNI) extension
    -Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)
    -f protocol     Specify SSL/TLS protocol
                    (TLS1, TLS1.1, TLS1.2 or ALL)
    -E certfile     Specify optional client certificate chain and private key

Nhưng ta chú ý đến những tham số cơ bản sau: Các tham số cơ bản:

  • -n - Tổng số request muốn test
  • -c - Số lượng request thực hiện đồng thời trong cùng một thời điểm.

Ví dụ: Giả sử ta muốn test mô phỏng cho 100 users truy cập cùng một lúc để lấy Voucher trong Shopee. Vì thói quen của users là muốn có nhanh cho nên họ sẽ refresh page liên tục, ta cho là 50 lần. Như vậy ta có 100 người truy cập và tổng số lượng request = 100 * 50 = 5000 request. Vậy ta sẽ thiết lập như sau:

> ab -n 5000 -c 100 http://shopee.com/vouchers

và kết quả được in ra như sau:

Server Software:        Apache
Server Hostname:        shopee.com

Document Path:          /
Document Length:        5350 bytes

Concurrency Level:      100
Time taken for tests:   10.332 seconds
Complete requests:      5000
Failed requests:        0
Total transferred:      4584474 bytes
HTML transferred:       4242550 bytes
Requests per second:    76.75 [#/sec] (mean)
Time per request:       13028.887 [ms] (mean)
Time per request:       13.029 [ms] (mean, across all concurrent requests)
Transfer rate:          433.32 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      705 2995 1581.7   2485    8615
Processing:   226  714 308.1    646    5827
Waiting:      225  700 299.4    641    5827
Total:        982 3709 1606.0   3293    8847

Percentage of the requests served within a certain time (ms)
  50%   3293
  66%   3919
  75%   4543
  80%   5038
  90%   6358
  95%   7021
  98%   7455
  99%   7526
 100%   8847 (longest request)

Giải thích ý nghĩa các tham số:

  • Server Software - Phiển bản hiện thời của Web Server
  • Server Hostname - DNS hoặc IP cung cấp cho việc đánh giá, chỉ định port trên command line
  • Server Port - Port kết nối tới, nếu không chỉ định port trên command line, giá trị mặc định là 80 cho http hoặc 443 cho https
  • SSL/TLS Protocol - Giao thức sử dụng mặc định giữa client và Server, sẽ chỉ xuất hiện nếu sử dụng SSL
  • Document Path - Request URI chỉ định Test
  • Document Length - Độ dài của phản hồi (HTML, CSS), tính bằng byte. Nếu độ dài của phản hồi thay đổi, kết quả phản hồi được coi là lỗi
  • Concurrency Level - Số lượng client đồng thời gửi request
  • Time taken for tests - Tổng thời gian test, tính từ request đầu tiên tới request cuối cùng
  • Complete requests - Số lượng Request thành công
  • Failed requests - Số lượng Request thất bại, nếu có sẽ có mô tả về lỗi
  • Non-2xx responses - Số lượng phản hồi không phải status code 200.
  • Total body sent- Chỉ quan tâm khi bài test thực hiện hành động POST hoặc PUT tới server
  • Total transferred - Tổng số byte nhận được từ server
  • HTML transferred - Số lượng byte nhận được (Các file html), kết quả đã loại bỏ số byte trong HTTP header
  • Requests per second - Tổng số request thực hiện trong 1s. Tính bằng tổng thời gian chia số lượng request hoàn thành (Time taken for tests / Complete requests)
  • Time per request- Thời gian trung bình trên một request.
  • Transfer rate - Tốc độ đường truyền (Downloading tại client). Tính bằng: 1024
  • Connection Times: Tính bằng ms
    • Connect và Waiting times: Thời gian sử dụng để mở kết nối và nhận kết quả (bit đầu tiên)
    • Processing times: Thời gian đợi server xử lý và phản hồi
    • Total time: Tổng thời gian xử lý (Connect + Processsing + Waiting)

Ghi kết quả check vào file

Bổ sung thêm tùy chọn -g <Tên file> vào câu lệnh test:

ab -n 5000 -c 100 -g data.txt http://shopee.com/vouchers

Kết quả như sau:

starttime    seconds    ctime    dtime    ttime    wait
Wed Jun 15 10:30:36 2022    1655263836    604    222    826    220
Wed Jun 15 10:30:34 2022    1655263834    606    223    829    222
Wed Jun 15 10:30:36 2022    1655263836    603    226    830    225
Wed Jun 15 10:30:36 2022    1655263836    606    225    832    224
Wed Jun 15 10:30:34 2022    1655263834    609    223    832    222
Wed Jun 15 10:30:37 2022    1655263837    609    224    833    223
Wed Jun 15 10:30:36 2022    1655263836    609    224    833    223
Wed Jun 15 10:30:36 2022    1655263836    604    229    833    228
Wed Jun 15 10:30:33 2022    1655263833    611    224    834    222
Wed Jun 15 10:30:37 2022    1655263837    611    223    834    223

Lưu ý:

  • seconds: Kiểu dữ liệu thời gian (Dạng timestamp linux, UTC)
  • ctime: Thời gian mở kết nối (Connection Time)
  • dtime: Thời gian xử lý (Processing Time)
  • ttime: Tổng thời gian (Tổng = ctime + dtime )
  • wait: Thời gian chờ (Waiting Time)

Nếu muốn học thêm nhiều hơn có lẽ nên tham khảo:

Công cụ apache - benchmarking

Có thể bạn đã bị missing