Hướng dẫn Test khả năng chịu tải của server với Artillery

999
25-03-2020
Hướng dẫn Test khả năng chịu tải của server với Artillery

Trong quá trình vận hành website, kiểm tra khả năng chịu tải của máy chủ là một việc làm quan trọng, nó góp phần giảm thiểu gián đoạn kết nối giữa người dùng với trang web. Bài viết dưới đây Bizfly Cloud sẽ hướng dẫn bạn kiểm tra khả năng chịu tải của server với công cụ Artillery.

Giới thiệu

Mỗi máy chủ web có một khả năng chịu tải khác nhau, tùy theo tài nguyên của hệ thống. Khả năng chịu tải sẽ có tác động trực tiếp đến số lượng HTTP request mà máy chủ có thể xử lí. Qua đó gián tiếp ảnh hưởng tới số lượng người dùng mà website có thể phục vụ tại cùng một thời điểm.

Việc không lường trước được khả năng chịu tải của web server có thể gây ra gián đoạn kết nối giữa người dùng và website. Khi đó máy chủ không xử lí được các request và trả về lỗi "500 Internal Server Error" – người dùng không truy cập được trang web.

Hướng dẫn Test khả năng chịu tải của server với Artillery - Ảnh 1.

Không ai muốn điều này xảy ra.

Vì vậy, việc của chúng ta là nắm bắt được khả năng chịu tải của server, từ đó đưa ra lộ trình nâng cấp máy chủ web hợp lý để phục vụ người dùng cũng như sự phát triển của doanh nghiệp.

Trong bài viết này, chúng ta sẽ tìm hiểu cách kiểm tra chịu tải của server bằng công cụ Artillery.

Sử dụng Artillery để test chịu tải của server

Artillery có hai phiên bản là Community Edition (miễn phí) và Pro Edition (có phí). Bản Pro có giá từ $199 sẽ thích hợp với các hệ thống lớn. Trong bài viết này, chúng ta sẽ học cách sử dụng Artillery bản miễn phí.

Hướng dẫn Test khả năng chịu tải của server với Artillery - Ảnh 2.

Cài đặt

Do được viết bằng Node.js, nên Artillery yêu cầu bạn phải cài Node.js phiên bản 10.16.3 trở lên.

Nếu đã có Node.js phiên bản mới, bạn chạy câu lệnh cài đặt như sau:

npm install -g artillery

Bạn có thể kiểm tra phiên bản Artillery với lệnh:

artillery -V

Nếu Artillery trả về phiên bản hiện tại, quá trình cài đặt hoàn tất.

Cấu hình và sử dụng

Sau khi cài đặt thành công, bạn có thể thử chạy một lệnh đơn giản:

artillery quick --count 10 -n 20 https://bitflycloud.vn/

Với câu lệnh trên, bạn đã tạo ra 10 "user ảo", mỗi user gửi 20 HTTP request (GET) tới địa chỉ https://bizfycloud.vn/

Tuy nhiên, câu lệnh trên chỉ là một ví dụ đơn giản với lệnh quick. Trong thực tế, hành vi truy cập và lướt web của người dùng rất phức tạp. Các request gửi tới server thường theo một vài kịch bản, tùy theo cách mà user sử dụng website.

Trong trường hợp đó, ta cần tạo ra một kịch bản test.

Kịch bản test

Copy toàn bộ đoạn mã sau vào file hello.yml:

config:

target: 'https://bitflycloud.vn'

phases:

- duration: 60

arrivalRate: 20

defaults:

headers:

x-my-service-auth: '987401838271002188298567'

scenarios:

- flow:

- get:

url: "/docs"

Giải thích:

Trong script trên, Artillery sẽ chạy test trên URL https://bitflycloud.vn. Chúng ta chỉ chạy một phase kéo dài 60 giây và với 20 người dùng ảo (trung bình mỗi giây).

Phần scenarios quy định các kịch bản mà mỗi user ảo chọn ngẫu nhiên. Ở đây chỉ có một kịch bản duy nhất, bao gồm một GET request.

Chạy test

Để chạy file hello.yml trên, bạn nhập lệnh:

artillery run hello.yml

Trong khi Artillery chạy test, báo cáo sẽ được in ra và trả về Terminal sau mỗi 10 giây.

Cuối bài test sẽ có một report tổng có cấu trúc như sau:

Complete report @ 2019-01-02T17:32:36.653Z

Scenarios launched: 300

Scenarios completed: 300

Requests completed: 600

RPS sent: 18.86

Request latency:

min: 52.1

max: 11005.7

median: 408.2

p95: 1727.4

p99: 3144

Scenario counts:

0: 300 (100%)

Codes:

200: 300

302: 300

  • Scenarios launchedsố user ảo được tạo ra trong toàn bộ thời gian test
  • Scenarios completed số user ảo đã hoàn thành kịch bản trong toàn bộ thời gian test.
  • Requests completed số HTTP requests và responses (hoặc WebSocket messages) đã được gửi.
  • RPS sent số request trung bình được hoàn thành mỗi giây.
  • p95: 1727.4 #95% số request cần <= 1727.4 milliseconds để hoàn tất
  • p99: 3144 #99% số request cần <= 3144 milliseconds để hoàn tất
  • Request latency độ trễ request (tính theo milisecond).
  • Codes số lượng HTTP response trả về tương ứng với mỗi status code.

Nếu kết quả trả về giá trị NaN ("not a number"), có nghĩa là Artillery không thu thập đủ HTTP responses để tính toán.

Nếu có lỗi xảy ra trong quá trình test (ví dụ như socket timeouts), hệ thống sẽ trả về Errors trong báo cáo.

Giải thích

Dựa vào báo cáo trên, chúng ta có thể nắm được tình trạng response của server dựa theo tổng số request được gửi đi như sau:

Trong 600 request hoàn thành thì có 300 response trả về code 200 (OK) và 300 response trả về code 302 (Found).

Thời gian hoàn tất một request:

  • Nhanh nhất: 52,1 milisec (0,052 giây)
  • Chậm nhất: 11005,7 milisec (11 giây)
  • Trung bình: 408,2 milisec (0,4 giây)
  • Có 95% số lượng request hoàn thành dưới 1727,4 milisec (1,7 giây).
  • Có 97% số lượng request hoàn thành dưới 3144 milisec (3,1 giây).

Từ báo cáo trên, có thể thấy mức độ chịu tải của server đang khá ổn với số lượng request theo kịch bản hello.yml, với arrivalRate là 20. Bạn có thể tăng arrivalRate để tiếp tục thử nghiệm khả năng chịu đựng của máy chủ web trước các request theo kịch bản.

Bạn cũng có thể tăng thêm các Phase để đa dạng hóa kịch bản gửi request tùy theo mục đích sử dụng của từng website.

Lời kết

Trên đây chỉ là những hướng dẫn đơn giản giúp bạn kiểm tra khả năng chịu tải của server bằng phần mềm Artillery. Trong thực tế, tùy từng quy mô và tính chất website mà có những kịch bản khác nhau để test khả năng chịu tải server. Chỉ khi hiểu được đặc thù website và công việc kinh doanh của mình, bạn mới có thể lên kế hoạch scale up hệ thống phù hợp để phục vụ tốt nhất cho khách hàng.

Theo Bizfly Cloud chia sẻ

SHARE