Hôm nay trong bài viết này mình sẽ cùng mọi người thực hiện một kịch bản test đo tốc độ phản hồi của server khi hệ thống có đồng thời có nhiều user cùng thao tác. Trong bài viết hôm nay mình sẽ demo trên K6 ( một công cụ đo hiệu năng “có vẻ như” same với JMeter cái này mình cũng chưa dùng đủ lâu nên cũng chưa đánh giá được, nếu sau này phát hiện ra điều gì mình sẽ update tiếp vào bài viết này )
Context
Trên team mình, TO ( Technical Owner ) đang có mong muốn check thử một kịch bản kiểu như thế này:
- 500 User cùng truy cập vào trang web
- 500 User này thực hiện login
- Cùng thực hiện view vài món hàng và nhấn thêm vào giỏ hàng
- 500 User thực hiện check out và thanh toán
Expected là thực hiện trong 1s
Đây rõ ràng là một yêu cầu khá mơ hồ và sau đó mình có yêu cầu cần define rõ ràng hơn vì nó có vẻ chưa đúng thực tế, nhưng đồng thời mình cũng muốn thử demo kịch bản này theo ý hiểu của mình.
Ở đây rõ ràng ta có thể demo kịch bản này trên JMeter, nhưng qua google mình có thấy một vài option khác nên cũng muốn thử xem sự khác nhau giữa các tool
Xây dựng kịch bản test
Đương nhiên mình sẽ không demo trên dự án công ty, nên trong phần tiếp theo mình sẽ demo luôn trên blog của mình ( lúc mình demo thì blog mình oẳng luôn chắc do hosting cùi quá mọi người tha cho blog của mình nhé ) demo trên trang android.com, trang này chắc vip pro max nên 500 user truy cập cùng lúc thoải mái.
Kịch bản của mình khá đơn giản: 500 user thực hiện truy cập vào web site > Đọc vài bài viết trên web > Cứ thế lặp đi lặp lại trong khoảng thời gian nhất định ( config trong scrip ) > Check hiệu năng của hệ thống
Cài đặt K6
K6 cài đặt khá đơn giản nên mọi người có thể tham khảo link sau: link
Sau khi cài đặt xong có thể check trong cmd với cú pháp k6 version màn hình trả ra version là thành công ( như hình dưới )
Test, run and view Result
Okie, giờ mình bắt tay vào viết script ( script k6 dùng JS để viết nên mọi người cần nắm một chút basic về ngôn ngữ này hoặc không thì nhờ chatgpt cho lẹ )
Đây là đoạn script của mình
import http from 'k6/http';
import { check, sleep } from 'k6';
// URL chính của trang web
const BASE_URL = 'https://www.android.com/';
// Danh sách các bài viết (URL)
const posts = [
'intl/vi_vn/new-features-on-android/', // Thay bằng slug của bài viết cụ thể
'intl/vi_vn/android-14/',
'intl/vi_vn/safety/',
'intl/vi_vn/google-messages/',
'intl/vi_vn/why-android/',
];
// Cấu hình số lượng user và thời gian test
export const options = {
vus: 500, // Số lượng user đồng thời
duration: '100s', // Thời gian chạy test
};
export default function () {
// 1. Truy cập vào trang chính
const homepageResponse = http.get(BASE_URL);
check(homepageResponse, {
'Homepage loaded successfully': (res) => res.status === 200,
});
// 2. Lựa chọn ngẫu nhiên một bài viết từ danh sách
const randomPost = posts[Math.floor(Math.random() * posts.length)];
const postUrl = `${BASE_URL}${randomPost}`;
const postResponse = http.get(postUrl);
check(postResponse, {
'Post loaded successfully': (res) => res.status === 200,
});
// 3. Giả lập thời gian đọc bài viết
sleep(Math.random() * 1 + 5); // 1-5 giây đọc bài
}
Đây là cấu trúc project, đơn giản là mình tạo một folder và thêm một script js file vào.
Sau đó mọi người run cmd như sau ( chạy 1 trong 2 )
- K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_PORT=5678 k6 run script_blog.js ( nếu muốn view dashboard realtime)
- k6 run script_blog.js ( view kết quả trên màn terminal )
Kết quả:
mọi người view trực tiếp trên dashboard
hoặc xem result trên terminal luôn cũng được ( cần tắt dashboard )
Overview kết quả
- Tỉ lệ fail ( không trả ra response success của server tương đối thấp – 69 lần 1.85% )
- dữ liệu nhận về từ server (data_received ) (1.3 Gb) => có vẻ phù hợp vì scenario cần tải nhiều nội dung -> chỉ số này cần hiểu biết về hệ thống sâu
- dữ liệu gửi đi (data_sent) 4.4 mb: do client chủ yếu gửi request đơn giản
- http_req_blocked: là thời gian mà 1 request phải chờ để có thể sent được request đến server
- http_req_connecting: là thời gian kết nối đến server
- http_req_sending (2.42ms): chỉ thời gian gửi request -> rất nhanh
- http_req_waiting (325.55ms) đây là thời gian server xử lý request và chuẩn bị trả về response. max=1s cho thấy server đã bị quá tải ở một số thời điểm.
Đánh gía chung:
Hệ thống hoạt động ổn định với hiệu năng phản hồi tốt (HTTP Request Duration trung bình thấp).Tuy nhiên, có một số vấn đề cần chú ý:
Lỗi HTTP Request: Lỗi tuy thấp nhưng cần kiểm tra nguyên nhân, có thể do timeout, lỗi server hoặc mạng. Một số request mất nhiều thời gian để xử lý, cần phân tích thêm.