+18

Giới thiệu về K6 - Performance Testing (Phần 1)

Happy New Year! Thay mặt Đảng, Nhà nước, Chính phủ, Quốc hội, Mặt trận Tổ quốc, các cơ quan đoàn thể, anh em bạn bè gần xa, bà con lối xóm xin được chúc ai đang đọc bài viết này cùng gia đình năm mới an khang thịnh vượng, vạn sự như ý, sớm có người thương ❤️, tâm hồn vui sướng, trong túi nhiều tiền.

Performance Testing là gì?

Đã có khi nào bạn muốn xem chất lượng, độ chịu tải của sản phẩm của bạn mà bạn không biết cách làm thế nào không? Hay là bạn có 1 API hay 1 tính năng nào đó khi bạn request bằng Postman thì vẫn tốt còn khi đưa vào hoạt động thì lại lỗi liên tục hay là load rất lâu khiến trải nghiệm người dùng không tốt không?

Vậy nên hãy cùng mình tìm hiểu về Performance Testing và công cụ để thực hiện nó nhé.

Performance Testing là kỹ thuật kiểm thử nhằm xác định băng thông, khả năng xử lý, khả năng mở rộng hay nói chung là hiệu năng của hệ thống dưới khối lượng truy cập, khối được công việc xác định. Kết quả của kiểm thử hiệu năng phục vụ việc điều tra, đo lường, đánh giá hiệu năng thực của hệ thống. Có các loại thông dụng như là:

Cùng với đó thì cũng có nhiều công cụ hỗ trợ như là Jmeter, Grinder, Artillery, LoadComplete,... Nhưng tại đây thì chúng mình cùng tìm hiểu về K6 nhé.

Cài đặt K6?

K6 có hỗ trợ các gói dành cho các hệ điều hành Linux, Mac và Windows. Ngoài ra, bạn có thể sử dụng Docker nhé.

Linux

Debian/Ubuntu

sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] 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

Fedora/CentOS

Sử dụng dnf hoặc yum trên các phiên bản cũ hơn

sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6

Mac

Sử dụng Homebrew

brew install k6

Windows

Ở đây mình sử dụng Chocolatey package manager nhé, bạn có thể cài đặt theo cách sau:

choco install k6

Docker

docker pull grafana/k6

Để kiểm tra thành công hay chưa hãy chạy command:

k6 version

Performance Testing với K6

Với k6 thì bạn cần phải biết 2 khái niệm là Virtual Users - VUs ( bạn có thể cài đặt số lượng người dùng ảo truy cập đồng thời trên sản phẩm của bạn) và Duration - 1 chuỗi quy định khoảng thời gian quá trình kiểm thử diễn ra.

Để tạo và Run 1 bài Test trên K6 khá là đơn giản do K6 sử dụng Javascript để chạy test nên khá là quen thuộc đối với chúng ta. 1 file js đơn giản dùng trong kiểm thử với k6 sẽ trông như thế này:

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

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

Hoặc bạn có thể thêm nhiều VUs và Duration như sau:

import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 10,
  duration: '30s',
};
export default function () {
  http.get('http://k6.io');
  sleep(1);
}

Hoặc bạn có thể tăng giảm số lượng VUs trong quá trình Test:

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

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 40 },
    { duration: '20s', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://k6.io/');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

Bây giờ chúng ta hãy tạo file test.js bằng Config trên và chạy bằng command này để xem kết quả nhé (Ở đây mình dùng docker nhé):

docker run --rm -i grafana/k6 run - <test.js

Và đây là kết quả End of test:

✗ status was 200
      ↳  96% — ✓ 565 / ✗ 21

     checks.........................: 96.41% ✓ 565      ✗ 21  
     data_received..................: 307 MB 1.9 MB/s
     data_sent......................: 699 kB 4.2 kB/s
     http_req_blocked...............: avg=62.99ms  min=178ns   med=445ns    max=30.02s  p(90)=1.35µs  p(95)=56.78ms 
     http_req_connecting............: avg=1.61ms   min=0s      med=0s       max=45.52ms p(90)=0s      p(95)=18.94ms 
     http_req_duration..............: avg=5.22s    min=64.3ms  med=719.46ms max=1m0s    p(90)=13.47s  p(95)=31.23s  
       { expected_response:true }...: avg=3.29s    min=64.3ms  med=640.2ms  max=55.45s  p(90)=7.43s   p(95)=17.15s  
     http_req_failed................: 3.58%  ✓ 21       ✗ 565 
     http_req_receiving.............: avg=3.85s    min=0s      med=517.01ms max=59.97s  p(90)=6.62s   p(95)=25.29s  
     http_req_sending...............: avg=138.95µs min=24.4µs  med=87.48µs  max=2.49ms  p(90)=218.9µs p(95)=306.93µs
     http_req_tls_handshaking.......: avg=61.17ms  min=0s      med=0s       max=29.99s  p(90)=0s      p(95)=32.09ms 
     http_req_waiting...............: avg=1.37s    min=19.77ms med=29.22ms  max=1m0s    p(90)=1.05s   p(95)=2.8s    
     http_reqs......................: 586    3.54026/s
     iteration_duration.............: avg=6.19s    min=1.06s   med=1.74s    max=1m1s    p(90)=14.53s  p(95)=31.85s  
     iterations.....................: 585    3.534218/s
     vus............................: 1      min=1      max=40
     vus_max........................: 40     min=40     max=40

Kết quả đã có và chúng ta hãy cùng phân tích xem các metrics trong End of test có gì nhé:

Mỗi thông số về http_req đều có các chỉ số là avg, min, max, med, p(90), p(95).

  • Check (check) là tỷ lệ check thành công.
  • Response time (http_req_duration) là tổng thời gian cho request. Nó bằng với http_req_sending + http_req_waiting + http_req_receiving.
  • Request rate (http_reqs) là tổng số yêu cầu HTTP k6 được tạo.
  • Failed request (http_req_failed) là tỷ lệ yêu cầu không thành công theo setResponseCallback.
  • Connecting (http_req_connecting) là thời gian thiết lập kết nối TCP với máy chủ.
  • TLS handshaking (http_req_tls_handshaking) là thời gian bắt tay phiên TLS với máy chủ.
  • Data sent (data_sent) là số lượng dữ liệu được gửi. Theo dõi dữ liệu cho một URL riêng lẻ để theo dõi dữ liệu cho một URL riêng lẻ.
  • Data received (data_received) là số lượng dữ liệu đã nhận.
  • Receiving (http_req_receiving) là thời gian nhận dữ liệu phản hồi từ máy chủ.
  • Sending (http_req_sending) là thời gian gửi dữ liệu phản hồi từ máy chủ.
  • Block (http_req_blocked) thời gian bị chặn (chờ kết nối TCP miễn phí) trước khi bắt đầu request.
  • Waiting (http_req_waiting) là thời gian chờ phản hồi từ máy chủ.
  • Iteration duration (iteration_duration) là thời gian cần thiết để hoàn thành một lần lặp lại đầy đủ, bao gồm cả thời gian dành cho khởi tạo và hủy.
  • Iteration (iterations) là tổng số lần VUs thực thi default function.
  • VUs (vus) là số lượng active users.
  • VUs max (vus_max) là số lượng VU tối đa.

Nếu các bạn không muốn tự tay code file Config bằng Javascript như trên thì các bạn cũng có thể sử dụng cloud K6 để Test nhé, rất là tiện đó. Các bạn click vào đây để trải nhiệm nhé. (Lưu ý là bản Free nên sẽ bị giới hạn khác nhiều nhưng có còn hơn không đúng không các bạn :v)

Tổng kết:

Vậy là mình đã giới thiệu cơ bản cho các bạn về Performance Testing và cách sử dụng K6. Mong là sẽ giúp đỡ được mọi người 1 phần nào đó trong quá trình tìm hiểu về Performance Testing. Ở phần sau mình sẽ tiếp tục chia sẻ sâu hơn về K6 nhé.

Tài liệu tham khảo: https://k6.io/


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.