1. Vì sao cần kiểm thử tải và k6 giải bài toán gì
Một hệ thống fintech có thể chạy mượt khi một người kiểm thử bấm thử, nhưng sụp đổ vào lúc 9 giờ sáng ngày lương về khi hàng chục nghìn người cùng đăng nhập, chuyển khoản và tra soát. Kiểm thử chức năng chỉ trả lời câu hỏi 'tính năng có đúng không', còn kiểm thử tải (load testing) trả lời một câu hỏi khác hẳn: 'hệ thống chịu được bao nhiêu người dùng cùng lúc trước khi chậm hoặc lỗi'. Đây là loại rủi ro không thể phát hiện bằng cách click tay, vì nó chỉ xuất hiện khi có áp lực đồng thời thật sự.
k6 (nay là Grafana k6) là công cụ mã nguồn mở để viết và chạy kiểm thử tải bằng cách mô phỏng nhiều người dùng ảo. Điểm mạnh của k6 là kịch bản test được viết bằng JavaScript nhưng nhân chạy bằng Go, nên vừa dễ viết vừa nhẹ tài nguyên, cho phép sinh hàng nghìn người dùng ảo trên một máy khiêm tốn. Trong tài liệu này chúng ta sẽ đi từ khái niệm gốc đến script đầu tiên, rồi tới cách đọc kết quả một cách chuyên nghiệp.
2. Các khái niệm cốt lõi: VU, iteration, throughput, latency
Trước khi viết dòng code nào, cần nắm bốn khái niệm nền. Một Virtual User (VU) là một luồng độc lập trong k6, lặp đi lặp lại kịch bản của bạn giống như một người dùng thật. Một iteration là một lần chạy trọn vẹn default function. Throughput (thông lượng) là số request hệ thống phục vụ được mỗi giây — thước đo công suất. Latency (độ trễ) là thời gian một request từ lúc gửi tới lúc nhận đủ phản hồi — thước đo trải nghiệm.
Điều quan trọng và hay bị hiểu lầm: nhiều VU không tự động nghĩa là nhiều throughput. Nếu server chậm, mỗi VU phải chờ lâu hơn cho mỗi iteration, nên số request/giây thực tế lại giảm. Vì vậy chuyên gia hiệu năng không nói 'chúng tôi chạy 500 VU' như một mục tiêu, mà nói 'chúng tôi đạt X request/giây với p95 latency Y'. Con số phần trăm (percentile) như p95 hay p99 quan trọng hơn giá trị trung bình, vì trung bình che giấu những người dùng bị chậm nhất — mà chính họ mới là người phàn nàn.
- VU — người dùng ảo, một luồng lặp kịch bản
- iteration — một lần chạy trọn default function
- throughput — req/s hệ thống phục vụ được
- latency — thời gian request; đọc theo p95/p99, không chỉ trung bình
- error rate — tỉ lệ request thất bại dưới tải
3. Cài đặt k6 và cấu trúc một script tối thiểu
k6 là một tệp nhị phân độc lập, cài bằng trình quản lý gói của hệ điều hành (Homebrew trên macOS, apt trên Debian/Ubuntu, Chocolatey trên Windows) hoặc chạy qua Docker. Một script k6 luôn có hai phần bắt buộc để chạy được: một hàm mặc định (default function) chứa hành vi mỗi VU sẽ lặp, và (tùy chọn nhưng gần như luôn dùng) một đối tượng options khai báo cách áp tải.
# Cài đặt k6
brew install k6 # macOS
sudo apt-get install k6 # Debian/Ubuntu (sau khi thêm repo Grafana)
choco install k6 # Windows
# Chạy một script
k6 run script.js
# Chạy qua Docker, ghi đè số VU và thời lượng qua CLI
docker run --rm -i grafana/k6 run - <script.js
k6 run --vus 50 --duration 30s script.js// script.js — script k6 tối thiểu tuyệt đối
import http from 'k6/http';
import { sleep } from 'k6';
// Hàm mặc định: MỖI VU lặp lại thân hàm này liên tục
export default function () {
http.get('https://test.k6.io'); // gửi 1 GET request
sleep(1); // "think time" — nghỉ 1 giây như người thật
}
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!