banner-news

Trong bài này

    05 Bước test chịu tải của Server, cách tính mức chịu tải

    18/05/2023

    Test chịu tải của Server là bước quan trọng cần thực hiện khi vận hành website. Khả năng chịu tải của trang web đến khả năng xử lý HTTP request của máy chủ. Nếu không tính toán trước khả năng chịu tải của web servre, kết nối giữa người dùng và website có thể bị gián đoạn và báo lỗi “500 Internal Server Error”. Cùng tìm hiểu cách kiểm tra chịu tải của server thông qua công cụ Artillery.

    Bước 1: Test chịu tải của Server với Artillery

    Artillery là một trong những công cụ test chịu tải của Server phổ biến nhất hiện nay. Phần mềm Artillery có hai phiên bản là Community Edition (miễn phí) và Pro Edition (trả phí). Phiên bản miễn phí thường được sử dụng cho mục đích cá nhân, trong khi đó bản trả phí giá từ 199$ thích hợp với các hệ thống lớn của công ty, doanh nghiệp. Trong bài viết này, chúng ta sẽ tìm hiểu cách test chịu tải bằng phiên bản miễn phí.

    Công cụ Artillery test chịu tải của Server có hai phiên bản miễn phí và trả phí

    Bước 2: Cài đặt Artillery

    Để thực hiện kiểm tra độ chịu tải cho web server với Artillery, trước tiên bạn cần cài Node.js phiên bản 10.16.3 trở lên. Sau khi thiết lập Node.js phiên bản mới, bạn thực hiện chạy câu lệnh cài đặt sau:

    npm install -g artillery

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

    artillery -V

    Nếu artillery -V trả về phiên bản hiện tại, cài đặt được hoàn tất. Trong trường hợp không check được phiên bản, việc cài đặt vẫn chưa thành công.

    Bước 3: Chạy thử lệnh đơn giản trên Artillery

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

    artillery quick --count 10 -n 20 https://artillery.io/

    Khi thực hiện 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://artillery.io/

    Câu lệnh trên chỉ là ví dụ đơn giản với lệnh quick. Trên thực tế, người dùng truy cập web và tương tác với server theo kịch bản chứ không đơn thuần gửi request như ví dụ.

    Bước 4: Tạo một kịch bản test

    Trước khi thực hiện test chịu tải của Server theo kịch bản, bạn cần ghi nhớ một số từ khóa để thiết lập cấu hình:

    • target: địa chỉ server cần kiểm tra chịu tải (thường là base URL đối với HTTP application hoặc hostname đối với WebSocket Server).
    • phase: thời gian kiểm tra và tần suất gửi request trong thời gian test. 

    - Trong phase có thể khai báo nhiều phase liên tiếp với thời gian và tần suất request khác nhau. 

    - Bên cạnh đó, bạn có thể đặt tên cho từng phases, sử dụng pause để tạo ra một phase tạm dừng, không thực hiện bất cứ thao rác gì. 

    - Với rampTo, bạn có thể hiểu nó giống như vòng for, ví dụ khi khai báo arrivalRate: 0rampTo: 10 thì artillery sẽ chia thành các phase liên tiếp với arrialRate lần lượt là 0, 1, 2, 3, 4, 5,... , 10.

    • headers: chỉ định tiêu đề HTTP mặc định cho mọi yêu cầu bạn gửi đi.
    • environments: nếu muốn tải sử dụng phần test cho các môi trường khác nhau như staging hay production, bạn có thể khai báo thêm môi trường như sau:
    environments:
        production:
            target:
            phases:
        staging:
            target:
            phases:
    • scenarios: khai báo kịch bản test (được khai báo giống như một object). Scenarios bắt buộc chứa thuộc tính flow và một số thuộc tính khác như name, weight. 

    - Trong đó, flow là một mảng khai báo các hành động user ảo sẽ thực hiện trong scenarios, chẳng hạn request GET/POST đến HTTP application. 

    - Thuộc tính name mô tả chi tiết hoạt động scenarios. - Thuộc tính weight là trọng số của scenarios, có thể hiểu là tỉ lệ % scenarios được chọn thực hiện.

    Sau khi tạo kịch bản test, kết quả thu được là một file .yml cấu trúc tương tự như sau:

    config:
      target: 'https://artillery.io' #địa chỉ muốn test
      phases: #có thể  khai báo để chạy nhiều phases với cài đặt cụ thể khác nhau 
        - duration: 60  #kéo dài trong 60s
          arrivalRate: 20 #trung bình 20 user/giây
          name: "tên phase 1"
        - pause: 60 #phase này sẽ không thực hiện gì (pause) trong 60s
        - duration: 
          arrivalRate:
          name: "tên phase 2"
      defaults:
        headers:
          x-my-service-auth: '987401838271002188298567'
    scenarios: #lên kịch bản cho cho từng user
      - flow:
        - get:
            url: "/docs"
        - post: 
            url: "/resource

    Bước 5: Chạy test

    Để chạy test example.yml, bạn hãy thực hiện câu lệnh:

    artillery run example.yml

    Khi Arrtillery chạy test, báo cáo sẽ được trả về Terminal mỗi 10 giây. Kết quả thu được có dạng 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

    Trong đó:

    • Scenarios launched số 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ề là giá trị NaN ("not a number"), điều này ngụ ý rằng Artillery không thu thập đủ các phản hồi HTTP để thực hiện tính toán.

    Báo cáo test chịu tải của Server được gửi về mỗi 10 giây

    Trong trường hợp có lỗi xảy ra trong quá trình kiểm thử, chẳng hạn như gặp phải vấn đề như timeouts của socket, hệ thống sẽ báo cáo về các lỗi trong phần "Errors" của báo cáo.

    Dựa vào báo cáo, chúng ta có thể hiểu về tình trạng phản hồi của server dựa trên tổng số request đã gửi đi. - Trong tổng số 600 request đã hoàn thành, có 300 response trả về mã code 200 (OK) và 300 response trả về mã code 302 (Found).

    Thông tin về thời gian hoàn tất mỗi request như sau:

    • Thời gian nhanh nhất: 52,1 milisec (0,052 giây)
    • Thời gian chậm nhất: 11005,7 milisec (11 giây)
    • Thời gian trung bình: 408,2 millisec (0,4 giây)
    • 95% số lượng request hoàn thành dưới 1727,4 milisec (1,7 giây)
    • 97% số lượng request hoàn thành dưới 3144 milisec (3,1 giây)

    Từ báo cáo, có thể nhận thấy rằng server đang xử lý tốt với số lượng request theo kịch bản example.yml, với arrivalRate là 20. Đề xuất có thể tăng arrivalRate để kiểm tra khả năng chịu đựng của máy chủ web trước các request theo kịch bản.

    Ngoài ra, có thể tăng thêm các Phase để đa dạng hóa kịch bản gửi request, phù hợp với mục đích sử dụng cụ thể của từng trang web.

    Trên đây là hướng dẫn các bước test chịu tải của Server bằng phần mềm Artillery bản miễn phí. Tùy thuộc vào quy mô và tính chất website, kịch bản test server có thể có sự thay đổi phù hợp với trường hợp cụ thể.

    CMC Cloud - Giải pháp Điện toán đám mây Toàn diện & Linh hoạt nhất. Cho phép tùy biến sử dụng và quản trị 25+ dịch vụ


      content-banner
      News Detail - Footer Email MKT

      Đăng ký nhận thông tin

      Bạn muốn cập nhật thông tin mới nhất từ CMC Cloud?! Hãy để lại địa chỉ email của bạn ngay để nhận những bản tin bổ ích

      back to top

      logo

      © 2023, CMC Cloud. All rights reserved.

      Business Registration Certificate

      Giấy ĐKKD: 0102900049. Nơi cấp: Sở Kế hoạch & Đầu tư Thành phố Hà Nội

      Chịu trách nhiệm nội dung: Đặng Tùng Sơn