Xem thêm

Kiểm tra chịu tải của server với K6.io (Phần 1)

Huy Erick
Sự ổn định của hệ thống là yếu tố quan trọng trong việc phát triển phần mềm. Để kiểm tra hiệu năng của một ứng dụng, việc kiểm tra khả năng chịu tải của server...

Sự ổn định của hệ thống là yếu tố quan trọng trong việc phát triển phần mềm. Để kiểm tra hiệu năng của một ứng dụng, việc kiểm tra khả năng chịu tải của server là vô cùng quan trọng. Tuy nhiên, không thể chỉ dùng cách gửi yêu cầu một cách thủ công để kiểm tra. Đó là lý do tại sao đã có rất nhiều công cụ hỗ trợ kiểm tra chịu tải của server như Artillery, Jmeter và một công cụ mới khá thú vị là K6.io.

Kiểm tra chịu tải của server với K6.io (Phần 1)

K6.io là một công cụ mạnh mẽ và linh hoạt, hỗ trợ trên nhiều hệ điều hành và môi trường như Linux, Mac, Windows và cả Docker.

Linux (Debian/Ubuntu)

$ sudo apt-key adv -keyserver hkp://keyserver.ubuntu.com:80 -recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
$ echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
$ sudo apt-get update
$ sudo apt-get install k6

Mac (brew)

Sử dụng brew để cài đặt K6.io.

$ brew install k6

Windows (MSI installer)

Bạn có thể tải bản cài đặt K6.io tại đường dẫn: https://dl.bintray.com/loadimpact/windows/k6-latest-amd64.msi

Nếu bạn đã sử dụng Chocolatey package manager, bạn có thể cài đặt K6.io bằng cách sau:

$ choco install k6

Docker

$ docker pull loadimpact/k6

Ở bài viết này, chúng ta sẽ sử dụng Docker để cài đặt K6.io.

Kiểm tra version

Để kiểm tra xem K6.io đã được cài đặt thành công hay chưa, bạn có thể sử dụng lệnh sau:

$ k6 version # k6 v0.31.1 (2021-03-17T13:23:23+0000/e9d8349, go1.15.8, linux/amd64)

Nếu bạn nhìn thấy thông tin phiên bản K6.io, điều đó có nghĩa là cài đặt đã thành công!

Chạy K6.io

Với K6.io, bạn sẽ sử dụng file JavaScript để chạy các test. Việc tiếp cận này rất dễ dàng. Bạn chỉ cần tạo một file với tên homepage.js và chứa đoạn mã sau:

import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  vus: 10,
  duration: '30s',
};

export default function() {
  http.get('https://phamtuananh1996.github.io');
  sleep(1);
}

Ở đây, chúng ta đã định nghĩa vus = 10duration = 30s. Điều này có nghĩa là trong quá trình kiểm tra, sẽ có 10 user (Virtual User) truy cập vào website https://phamtuananh1996.github.io trong vòng 30 giây.

Để chạy kiểm tra, bạn có thể sử dụng lệnh sau:

$ k6 run homepage.js

Hoặc nếu bạn muốn chạy bằng Docker:

$ docker run -i loadimpact/k6 run - < homepage.js

Sau khi chạy xong, K6.io sẽ tổng hợp các số liệu như sau:

data_received..............: 148 MB 2.5 MB/s
data_sent..................: 1.0 MB 17 kB/s
http_req_blocked...........: avg=1.92ms min=1µs med=5µs max=288.73ms p(90)=11µs p(95)=17µs
http_req_connecting........: avg=1.01ms min=0s med=0s max=166.44ms p(90)=0s p(95)=0s
http_req_duration..........: avg=143.14ms min=112.87ms med=136.03ms max=1.18s p(90)=164.2ms p(95)=177.75ms
http_req_receiving.........: avg=5.53ms min=49µs med=2.11ms max=1.01s p(90)=9.25ms p(95)=11.8ms
http_req_sending...........: avg=30.01µs min=7µs med=24µs max=1.89ms p(90)=48µs p(95)=63µs
http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...........: avg=137.57ms min=111.44ms med=132.59ms max=589.4ms p(90)=159.95ms p(95)=169.41ms
http_reqs..................: 13491 224.848869/s
iteration_duration.........: avg=445.48ms min=413.05ms med=436.36ms max=1.48s p(90)=464.94ms p(95)=479.66ms
iterations.................: 13410 223.498876/s
vus........................: 100 min=100 max=100
vus_max....................: 100 min=100 max=100

Đây là một số thông số quan trọng mà chúng ta có thể giải thích như sau:

  • http_req_blocked: Thời gian mà Virtual User dành để chờ kết nối TCP.
  • http_req_connecting: Thời gian mà Virtual User dành để thiết lập kết nối TCP đến server.
  • http_req_duration: Thời gian mà Virtual User mất để thực hiện một yêu cầu HTTP từ đầu đến cuối.
  • http_req_receiving: Thời gian mà Virtual User mất để nhận phản hồi từ server.
  • http_req_sending: Thời gian mà Virtual User mất để gửi yêu cầu HTTP đến server.
  • http_req_tls_handshaking: Thời gian máy khách và máy chủ xác nhận lẫn nhau và bắt đầu giao tiếp qua TLS.
  • http_req_waiting: Thời gian mà Virtual User chờ đợi phản hồi từ server sau khi gửi yêu cầu.
  • http_reqs: Tổng số yêu cầu HTTP đã được thực hiện trong suốt quá trình kiểm tra.
  • iteration_duration: Tổng thời gian cho mỗi yêu cầu (bao gồm http_req_sending, http_req_waitinghttp_req_receiving).
  • iterations: Tổng số lần mà tất cả Virtual User trong quá trình kiểm tra đã chạy qua hàm default().
  • vus: Số lượng Virtual User được cấu hình để mô phỏng.
  • vus_max: Số lượng Virtual User tối đa mà kiểm tra được cấu hình (vus_max cho phép bạn mở rộng số lượng Virtual User trong kiểm tra lên tối đa).

Đây chỉ là một ví dụ đơn giản. Trong thực tế, việc tương tác giữa user và server thường diễn ra theo các kịch bản phức tạp hơn, không chỉ gửi yêu cầu đơn lẻ, mà còn có số lượng user tăng hoặc giảm.

Stages: Tăng giảm số lượng Virtual User

Bạn cũng có thể tăng giảm số lượng Virtual User trong quá trình kiểm tra. Bằng cách cấu hình options.stages, chúng ta có thể làm điều này. Hãy xem ví dụ dưới đây:

import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  stages: [
    { duration: '2m', target: 100 }, // dưới tải thường
    { duration: '5m', target: 100 },
    { duration: '2m', target: 200 }, // tải thường
    { duration: '5m', target: 200 },
    { duration: '2m', target: 300 }, // gần giới hạn chịu tải
    { duration: '5m', target: 300 },
    { duration: '2m', target: 400 }, // vượt quá giới hạn chịu tải
    { duration: '5m', target: 400 },
    { duration: '10m', target: 0 } // giảm số lượng Virtual User xuống 0
  ],
};

export default function() {
  http.get('https://phamtuananh1996.github.io');
  sleep(1);
}

Ở đây, chúng ta đã tăng số lượng Virtual User (target) và thời gian (duration) dần dần, sau đó giảm số lượng Virtual User xuống 0 để kiểm tra khả năng chịu tải của server (Stress Test).

K6.io cũng cung cấp cho chúng ta cloud để thực hiện kiểm tra và xem kết quả thông qua các biểu đồ và hình ảnh trực quan. Bạn có thể sử dụng miễn phí nhưng có giới hạn số lần kiểm tra và các cấu hình khác. Để sử dụng, bạn cần đăng ký tài khoản với Gmail hoặc Github.

Sau khi đăng nhập, bạn sẽ thấy giao diện dashboard và có hai lựa chọn để tạo kiểm tra là "Test builder" và "Script editor".

Kiểm tra chịu tải của server với K6.io (Phần 1)

"Test builder" cho phép bạn tạo kiểm tra bằng giao diện trực quan, trong khi "Script editor" cho phép bạn tạo các đoạn mã sử dụng JavaScript và chạy trên cloud.

Script editor

K6 Cloud cung cấp một trình soạn thảo script và một đoạn code mẫu để bạn sao chép vào. Sau khi hoàn thành, bạn chỉ cần nhấn "Run". Tuy nhiên, với tư cách là người dùng miễn phí, tôi chỉ có thể chạy với tối đa 50 Virtual User và 12 phút. Vì vậy, tôi đã điều chỉnh đoạn mã test của mình như sau:

import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  stages: [
    { duration: '2s', target: 10 }, // dưới tải thường
    { duration: '5s', target: 10 },
    { duration: '2s', target: 20 }, // tải thường
    { duration: '5s', target: 20 },
    { duration: '2s', target: 30 }, // gần giới hạn chịu tải
    { duration: '5s', target: 30 },
    { duration: '2s', target: 40 }, // vượt quá giới hạn chịu tải
    { duration: '5s', target: 40 },
    { duration: '10s', target: 0 } // giảm số lượng Virtual User xuống 0
  ],
};

export default function () {
  http.get('https://phamtuananh1996.github.io');
  sleep(1);
}

Sau khi chạy xong, bạn sẽ thấy một giao diện cuối cùng, hiển thị kết quả kiểm tra:

Kiểm tra chịu tải của server với K6.io (Phần 1)

Ở giao diện này, bạn có thể thấy rất nhiều thông số như biểu đồ VUs, yêu cầu, hiển thị lỗi, thống kê... Tại đây, tôi có thể thấy rằng với 40 Virtual User hoạt động đồng thời trong vòng 5 giây, website vẫn hoạt động bình thường.

Kiểm tra trên Cloud từ CLI

Bạn cũng có thể chạy kiểm tra trên máy local và stream kết quả lên cloud K6.io để xem kết quả một cách trực quan. Đầu tiên, bạn cần đăng nhập vào K6 cloud từ CLI:

  • Đăng nhập bằng username và password:
$ k6 login cloud
  • Đăng nhập bằng API Token:
$ k6 login cloud -token 

Để lấy được API Token sau khi đăng nhập, bạn có thể truy cập vào https://app.k6.io/account/api-token.

Sau khi đăng nhập thành công, bạn có thể chạy kịch bản kiểm tra trên máy local và stream kết quả lên K6.io cloud bằng lệnh sau:

$ k6 cloud script.js

Sau khi chạy xong, bạn sẽ nhận được một số thông tin và một đường dẫn URL để xem kết quả kiểm tra trên cloud:

/ |‾‾|  /‾‾/ /‾/ / /
| |_/ / / / /   |
| | / ‾‾ /    | |‾
| (_) |            / __________
|__| __ ___/ .io execution: cloud
script: script.js
output: https://app.k6.io/runs/TEST_RUN_ID

Bạn có thể truy cập vào URL đó để xem kết quả kiểm tra một cách trực quan:

Kiểm tra chịu tải của server với K6.io (Phần 1)

Sau khi chạy kiểm tra trên máy local, bạn sẽ thấy các thông số sau:

data_received..............: 148 MB 2.5 MB/s
data_sent..................: 1.0 MB 17 kB/s
http_req_blocked...........: avg=1.92ms min=1µs med=5µs max=288.73ms p(90)=11µs p(95)=17µs
http_req_connecting........: avg=1.01ms min=0s med=0s max=166.44ms p(90)=0s p(95)=0s
http_req_duration..........: avg=143.14ms min=112.87ms med=136.03ms max=1.18s p(90)=164.2ms p(95)=177.75ms
http_req_receiving.........: avg=5.53ms min=49µs med=2.11ms max=1.01s p(90)=9.25ms p(95)=11.8ms
http_req_sending...........: avg=30.01µs min=7µs med=24µs max=1.89ms p(90)=48µs p(95)=63µs
http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...........: avg=137.57ms min=111.44ms med=132.59ms max=589.4ms p(90)=159.95ms p(95)=169.41ms
http_reqs..................: 13491 224.848869/s
iteration_duration.........: avg=445.48ms min=413.05ms med=436.36ms max=1.48s p(90)=464.94ms p(95)=479.66ms
iterations.................: 13410 223.498876/s
vus........................: 100 min=100 max=100
vus_max....................: 100 min=100 max=100

Đây là một số thông số quan trọng mà chúng ta đã giải thích ở trên.

Trên đây là sơ lược về việc kiểm tra hiệu năng với K6.io và sử dụng cloud K6 để kiểm tra và xem kết quả một cách trực quan. Tuy nhiên, với phiên bản miễn phí, chúng ta bị hạn chế khá nhiều. Trong bài viết tiếp theo, tôi sẽ viết về việc sử dụng InfluxDB + Grafana để hiển thị kết quả kiểm tra miễn phí.

blog: https://phamtuananh1996.github.io Tham khảo: https://k6.io/docs/

1