← Về trang Blog
Performance Test

Stress test: Kỹ thuật, kịch bản và kinh nghiệm thực chiến

admin· Đăng ngày 16 tháng 7, 2025
Stress test: Kỹ thuật, kịch bản và kinh nghiệm thực chiến

0 giờ ngày mở bán. Lượng truy cập tăng gấp 8 lần chỉ trong 3 phút. Và hệ thống — vốn chạy mượt suốt nhiều tháng — bắt đầu trả về hàng loạt lỗi 503. Đó là khoảnh khắc mọi đội kỹ thuật đều sợ, nhưng phần lớn chỉ gặp lần đầu tiên ngay trên production, trước mặt người dùng thật.

Vấn đề cốt lõi của hiệu năng không nằm ở chuyện hệ thống nhanh hay chậm lúc bình thường — mà ở chỗ nó gãy ở ngưỡng nào, gãy theo cách nào, và có tự đứng dậy được không. Trớ trêu thay, hầu hết đội ngũ chỉ tìm ra câu trả lời khi đã quá muộn: hàng tháng trời xây dựng có thể sụp đổ trong vài giây, vào đúng thời điểm tệ nhất. Stress Test sinh ra để bạn biết trước những điều đó — trong môi trường kiểm soát, nơi sự cố không gây thiệt hại thật.

Trong bài viết này, bạn sẽ nắm được:

  • Bản chất của Stress Test và điểm khác biệt cốt lõi với Load Test, Spike Test.
  • Cách xác định mức tải mục tiêu dựa trên dữ liệu thay vì cảm tính.
  • Quy trình triển khai bằng Apache JMeter và bộ chỉ số bắt buộc phải giám sát.
  • Những cái bẫy khiến bạn kết luận sai về sức khoẻ thật của hệ thống.

Stress Test là gì?

Stress Test (kiểm thử quá tải) là một kỹ thuật kiểm thử hiệu năng phi chức năng, trong đó hệ thống bị đặt dưới mức tải cao hơn đáng kể so với điều kiện vận hành bình thường nhằm ba mục tiêu cốt lõi:

  • Xác định giới hạn chịu tải: hệ thống bắt đầu suy giảm ở mức nào, và gãy hẳn ở mức nào.
  • Phát hiện điểm nghẽn (bottleneck): nút thắt nằm ở tầng nào — ứng dụng, cơ sở dữ liệu, hạ tầng mạng hay tài nguyên máy chủ.
  • Đánh giá khả năng phục hồi (recovery): sau khi tải hạ xuống, hệ thống có tự trở lại trạng thái ổn định hay cần can thiệp thủ công.

Điểm mấu chốt: mục tiêu của Stress Test không phải để chứng minh hệ thống "chịu được", mà để chủ động tìm ra điểm gãy trong môi trường kiểm soát — nơi sự cố không gây thiệt hại thật.

Phân biệt Stress Test với Load Test và Spike Test

Ba loại kiểm thử thường bị dùng lẫn lộn. Sự khác biệt nằm ở hình dạng và mục đích của tải:

Loại kiểm thửMức tải áp dụngCâu hỏi cần trả lời
Load TestBằng tải kỳ vọng (ví dụ tải giờ cao điểm)Hệ thống có đáp ứng SLA ở tải dự kiến không?
Stress TestVượt ngưỡng (125%–200%+ hoặc đến khi gãy)Giới hạn ở đâu? Gãy như thế nào? Phục hồi ra sao?
Spike TestTăng vọt đột ngột rồi giảm nhanhHệ thống xử lý cú sốc tải tức thời thế nào?

Nói ngắn gọn: Load Test xác nhận kỳ vọng, Spike Test mô phỏng cú sốc, còn Stress Test đi tìm giới hạn.

Mục tiêu cụ thể của một bài Stress Test

  • Xác minh khả năng đáp ứng tải tăng trưởng trong tương lai (12–24 tháng tới).
  • Đo thời gian phản hồi (response time) khi hệ thống bị quá tải.
  • Đo mức tiêu thụ tài nguyên: CPU, RAM, Disk I/O, băng thông.
  • Phát hiện bottleneck, lỗi logic và rò rỉ bộ nhớ (memory leak) chỉ lộ ra dưới áp lực.
  • Kiểm chứng cơ chế tự phục hồi sau crash.

Cách xác định mức tải mục tiêu

Đây là bước quyết định chất lượng của cả bài test. Mức tải không được đặt theo cảm tính — nó phải xuất phát từ dữ liệu thực tế kết hợp với kế hoạch tăng trưởng kinh doanh.

Cách 1 — Suy ra từ tải hiện tại và tốc độ tăng trưởng

Giả sử hệ thống hiện phục vụ ổn định khoảng 239 VUs (Virtual Users) và doanh nghiệp đặt mục tiêu tăng trưởng 20%/năm. Khi đó các mốc tải kiểm thử có thể thiết lập như sau:

Hệ số tảiSố VUs mục tiêuÝ nghĩa
125%~ 300 VUsDự phòng tăng trưởng ngắn hạn
150%~ 360 VUsBiên an toàn cho cao điểm
200%~ 480 VUsKịch bản tăng trưởng mạnh / tình huống xấu
Biểu đồ các mốc tải VUs theo hệ số tăng trưởng
Trực quan hóa các mốc tải mục tiêu theo hệ số tăng trưởng.

Cách 2 — Dựa trên bội số của giờ cao điểm (peak time)

Khi đã có số liệu đo đếm thực tế ở giờ cao điểm, bạn có thể nhân lên thành các mốc 2X, 4X, 6X, 8X — tức kiểm thử với gấp 2, 4, 6, 8 lần lưu lượng peak time thực đo.

Kinh nghiệm thực chiến. Với ứng dụng mới hoặc chưa đủ số liệu lịch sử, đừng đoán mốc tải. Hãy chạy một bài tìm break-point trước (tăng tải dần đến khi hệ thống gãy), rồi phối hợp với BADevOps để chốt ngưỡng kiểm thử phù hợp với năng lực hạ tầng thật.

Triển khai với Apache JMeter

Công cụ phổ biến và miễn phí cho Stress Test là Apache JMeter. Để điều khiển tải đồng thời theo thời gian, nên dùng plugin Concurrency Thread Group (cài qua Plugin Manager) hoặc Ultimate Thread Group.

Bốn tham số cấu hình cốt lõi

Tham sốÝ nghĩa
Target ConcurrencyTổng số người dùng ảo (VU) cần đạt
Ramp-up TimeThời gian khởi tạo dần để đạt đủ số VU
Ramp-up StepsSố bước tăng tải trong giai đoạn ramp-up
Hold Target Rate TimeThời gian duy trì mức tải sau khi đã đạt đủ VU
Cấu hình Concurrency Thread Group trong JMeter
Cấu hình tải bằng Concurrency Thread Group trong JMeter.

Quy tắc thiết kế kịch bản

  1. Thời lượng: mỗi kịch bản nên chạy ít nhất 1–4 giờ để bộc lộ các vấn đề tích lũy (memory leak, đầy connection pool, tăng dần GC…).
  2. Tỷ lệ ramp-up: giữ ramp-up ≤ 1/3 tổng thời gian test, dành phần lớn thời gian cho giai đoạn ổn định (steady state) để phân tích.
  3. Ví dụ: test 1 giờ → ramp-up tối đa 20 phút, hold 40 phút. Nếu hạ tầng test mạnh, có thể rút ngắn ramp-up để tập trung quan sát giai đoạn ổn định.

Ví dụ cấu hình thực tế. Hệ thống đang ổn định ở mức 210 CCUs (Concurrent Users). Theo chiến lược tăng trưởng, mức tải stress được đẩy lên 125%, tức ~260 CCUs — sử dụng Ultimate Thread Group để kiểm soát từng giai đoạn tải.

Cấu hình Ultimate Thread Group cho kịch bản 260 CCUs
Thiết lập kịch bản ~260 CCUs bằng Ultimate Thread Group.

Bộ chỉ số cần giám sát

Sai lầm phổ biến nhất là chỉ nhìn vào response time. Một bài Stress Test có giá trị phải theo dõi đồng thời nhiều chiều:

Nhóm chỉ sốTheo dõi gì
Phía người dùngResponse time (avg, P90/P95/P99), throughput (req/s), tỷ lệ lỗi HTTP
Tài nguyên máy chủCPU, RAM, Disk I/O, network — đặc biệt là CPU spike và memory leak
Phía backendLog lỗi ứng dụng, thời gian truy vấn DB, connection pool, hàng đợi (queue)

Khuyến nghị dựng dashboard giám sát thời gian thực bằng Grafana + Prometheus (hoặc InfluxDB) để tương quan giữa tải và hành vi tài nguyên ngay khi test đang chạy.

Kinh nghiệm triển khai thực tế

  • Chuẩn hóa dữ liệu đầu vào: dữ liệu test phải phản ánh hành vi thật của người dùng. Dữ liệu "rác" sẽ cho kết quả sai lệch và những kết luận nguy hiểm.
  • Lặp lại và tinh chỉnh: một lần chạy là không đủ. Hãy chạy nhiều lần, điều chỉnh từng tham số và so sánh kết quả để loại trừ nhiễu.
  • Cô lập biến số: mỗi lần chỉ thay đổi một yếu tố (mức tải, cấu hình, dữ liệu) để biết chính xác điều gì gây ra thay đổi.
  • Test trên môi trường giống production: kết quả trên hạ tầng yếu hơn production gần như vô nghĩa khi ngoại suy.

Cảnh báo. Đừng kết luận "hệ thống ổn" chỉ vì response time đẹp. Một hệ thống có thể trả lời nhanh trong khi đang rò rỉ bộ nhớ hoặc âm thầm trả về lỗi 5xx cho một phần người dùng. Luôn đối chiếu throughput, tỷ lệ lỗi và log backend.

Kết luận

Stress Test không đơn thuần là "ép tải cho cao". Đó là một chiến lược chủ động nhìn trước điểm gãy của hệ thống. Khi thực hiện bài bản — từ xác định mức tải dựa trên dữ liệu, thiết kế kịch bản đúng quy tắc, đến giám sát đa chiều — bạn có thể xử lý bottleneck từ sớm, tối ưu chi phí hạ tầng và quan trọng nhất là ngăn ngừa downtime khi hệ thống thật sự đối mặt áp lực lớn từ người dùng.

Bạn đã từng gặp sự cố bất ngờ khi chạy Stress Test? Hãy chia sẻ kinh nghiệm thực chiến của bạn để cộng đồng cùng học hỏi và nâng cao kỹ năng kiểm thử hiệu năng.