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 ServerServer Hostname
- DNS hoặc IP cung cấp cho việc đánh giá, chỉ định port trên command lineServer 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 httpsSSL/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 SSLDocument Path
- Request URI chỉ định TestDocument 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ỗiConcurrency Level
- Số lượng client đồng thời gửi requestTime taken for tests
- Tổng thời gian test, tính từ request đầu tiên tới request cuối cùngComplete requests
- Số lượng Request thành côngFailed requests
- Số lượng Request thất bại, nếu có sẽ có mô tả về lỗiNon-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 serverTotal transferred
- Tổng số byte nhận được từ serverHTML transferred
- Số lượng byte nhận được (Các file html), kết quả đã loại bỏ số byte trong HTTP headerRequests 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: 1024Connection 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: