Giới thiệu
Kiểm tra, đánh giá tải là điều cần thiết trước khi triển khải sản phẩm. Và thật khó nếu sử dụng sức người để thử các kịch bản đặt ra. Lấy ví dụ cơ bản, để tạo ra tải mô phỏng cho 100 người truy cập cùng thời điểm chúng ta không thể tìm 100 người để thực hiện kịch bản này. Vậy để giải quyết vấn đề, ta sẽ sử dụng công cụ Apache HTTP server benchmarking tool (ab) để tạo ra tải mô phỏng.
Công cụ Apache HTTP server benchmarking tool (ab) được phát triển bởi Apache Software Foundation, là công cụ tạo ra tải mô phỏng cho Web Server bằng cách gửi các request đồng thời tới máy chủ. Công cụ này được tích hợp mặc định sau khi cài dịch vụ HTTP Apache Web Server phục vụ việc đánh giá Web server sau khi cài đặt.
Chuẩn bị
Mô hình
Đăng ký dịch vụ máy chủ Web
Truy cập Nhân hòa, đăng ký 1 Máy ảo CentOS 7 với cấu hình 2 CPU, 2GB RAM – 25 GB Disk (Cấu hình gói B)
Kết quả
Cài đặt máy chủ dịch vụ Web
Truy cập máy chủ ảo trên hệ thống nhân hòa
Cài đặt dịch vụ apache
yum install httpd -y
echo '<h1>Chào mừng tới Blog Cloud365</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
Kết quả
Tại máy tính cá nhân
Tại máy tính cá nhân (chạy hệ điều hành ubuntu 18.04) cài đặt các gói sau
sudo apt-get install apache2-utils
Phần 1: Cú pháp và tùy chọn Apache HTTP server benchmarking tool
Cú pháp đầy đủ
Cấu trúc: ab [options] [http[s]://]hostname[:port]/path
Hiển thị các tùy chọn
ab -h
Kết quả
thanhnb@thanhnb-pc:~$ ab -h
Usage: ab [options] [http[s]://]hostname[:port]/path
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
(SSL2, TLS1, TLS1.1, TLS1.2 or ALL)
Phần 2: Thực hiện bài Test đơn giản
Cú pháp đơn giản
ab -n <Số lượng request> -c <Số lượng đồng thời> <IP hoặc Domain>:<port><path>
Các tham số cơ bản:
-n
– Tổng số request thực hiện-c
– Số lượng request thực hiện đồng thời trong cùng một thời điểm
Ví dụ minh họa
Ở ví dụ này, ta sẽ sử dụng công cụ ab tool để tạo tải mô phỏng cho 200 người truy cập trong cùng một thời điểm. Và mỗi người truy cập sẽ thực hiện nhấn refresh page
50 lần. Để tạo ra kịch bản này, ta sẽ thiết tùy chọn concurrency
bằng 200 và tùy chọn requests
bằng 10000. Có thể hiểu đơn giản tùy chọn concurrency
tức số người truy cập trong cùng thời điểm và tùy chọn requests
là tổng số thao tác mà tất cả người truy cập cùng thực hiện (200 người thực hiện 50 lần vậy tổng thao tác là 10000).
Thực hiện test (Thực hiện tại máy tính cá nhân)
ab -n 10000 -c 100 http://10.10.11.38/
Kết quả
Server Software: Apache/2.4.6
Server Hostname: 10.10.11.38
Server Port: 80
Document Path: /
Document Length: 42 bytes
Concurrency Level: 100
Time taken for tests: 8.030 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 3020000 bytes
HTML transferred: 420000 bytes
Requests per second: 1245.28 [#/sec] (mean)
Time per request: 80.304 [ms] (mean)
Time per request: 0.803 [ms] (mean, across all concurrent requests)
Transfer rate: 367.26 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 30 136.5 8 2233
Processing: 5 45 50.7 30 964
Waiting: 4 43 44.8 30 658
Total: 7 75 146.7 38 2242
Percentage of the requests served within a certain time (ms)
50% 38
66% 60
75% 99
80% 106
90% 118
95% 137
98% 382
99% 1090
100% 2242 (longest request)
Giải thích ý nghĩa
- 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)
Phân tích kết quả:
- Phiên bản hiện tại của Apache webserver là
Apache/2.4.6
- Sẽ có 100 client đồng thời gửi request tới server (
Concurrency Level
) - Quá trình truyển tải hết
2.8801 MB
(3020000 bytes) cho 10000 request - Hoàn thành test mất 8.030s
- Có
1245.28
request thực hiện trong 1s (Requests per second
) - Băng thông sử dụng hết
367.26 Kbytes/sec
(Transfer rate
)
Thực hiện bài test và xuất kết quả dạng gnuplot format
Bổ sung thêm tùy chọn -g <Tên file>
vào câu lệnh test
Thực hiện test (Thực hiện tại máy tính cá nhân)
ab -n 10 -c 2 -g data.txt http://10.10.11.38/
Kết quả
cat data.txt
starttime seconds ctime dtime ttime wait
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 3 5 3
Lưu ý:
seconds
: Kiểu dữ liệu thời gian (Dạng timestamp linux, UTC) (VD: 1548910604 = Thursday, January 31, 2019 4:56:44 AM)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)
Phần 3: Thực hiện Test với Web động
Để tạo ra bài test sát với thực tể hơn, ta sẽ cài đặt một web động để test. Ở đây ta sẽ sử dụng Flask Python
Cài đặt flask
Thực hiện tại máy chủ ảo
Cài đặt python3.6
và virtualenv
yum install https://centos7.iuscommunity.org/ius-release.rpm -y
yum install python-devel -y
yum install python36-devel -y
yum install python36 -y
yum install python36u-mod_wsgi -y
yum install python-pip -y
yum install python36u-pip -y
pip3.6 install virtualenv
Cài đặt flask
mkdir webserver_demo && cd webserver_demo
virtualenv env
source env/bin/activate
pip install Flask==0.10.1
pip freeze > requirements.txt
echo 'from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host="0.0.0.0")' > app.py
Chạy web server
python app.py
Kết quả
Thực hiện bài test và đánh giá
AB Tool hỗ trợ nhiều tham số hỗ trợ cho việc mô phỏng tải thực tế. Việc hiểu và sử dụng các tham số hợp lý sẽ hỗ trợ việc đánh giá tải sát với thực tế hơn.
Thực hiện Test với request cơ bản (Thực hiện tại máy tính cá nhân)
ab -n 100 -c 1 http://10.10.11.38:5000/
Kết quả bài test đơn giản
Test với request bổ sung thêm các tùy chọn mở rộng (Thực hiện tại máy tính cá nhân)
ab -l -r -n 100 -c 1 -k -H "Accept-Encoding: gzip, deflate" http://10.10.11.38:5000/
Giải thích tham số:
-l
– Cho phép nhiều độ dài file khác nhau (Dùng web động)-r
– Mặc định ab sẽ tự thoát khi nhận lỗi phản hồi từ webserver, với tham số-r
ab sẽ thông báo lỗi nhưng bài test vẫn tiếp tục thực hiện-H
– Thêm các thông số vào header request (Tham số giúp request giống với thực tế hơn)
Kết quả bài test nâng cao
Màn hình tay trái (thanhnb@thanhnb-pc:~$) là máy tính cá nhân của tôi, màn hình tay phải máy chủ Web (root@webserver-apache-centos7: ~). Sẽ có sự khác biệt giữa test với các request đơn giản và các request với thêm các tùy chọn. Dễ thấy nhất, trong lần đầu tiên test (với tham số mặc định) kết quả lại là 106.35
request trên 1s còn trong lần thứ 2 test(với tham số tùy chọn) kết quả trả lại là 85
request trên 1s. Từ đây ta sẽ có thểm các số liệu để đánh giá với hệ thống thực tế trước khi triển khai.
Tham số tùy chọn khác:
-v 2
– Trong trường hợp thực hiện bài test gặp lỗi, sử dụng tham số này để thấy header HTTP phản hồi lại từ server
Tổng kết
Các kết quả có được khi đánh giá hệ thống Web theo AB Tool có thể không phản ánh chính xác hiệu năng của server. HTTP chỉ là 1 phần rất nhỏ khi muốn đánh giá hiệu năng hệ thống, hiệu năng của hệ thống Web còn bao gồm rất nhiều thành phần khác như các templating engine
, database
. Cuối cùng, công cụ sẽ cung cấp các thông số để so sánh, đánh giá ban đầu
Các công cụ đánh giá hệ thống Web khác:
- httperf
- weighttp
- httpress
- siege
- JMeter
- tourbus
Leave a Reply