Business

VPS 12 USD Chịu Tải Bao Nhiêu Users? Benchmark K6 Bất Ngờ

<!– SEO Title (

VPS 12 USD Chịu Tải Bao Nhiêu Users? Benchmark K6 Bất Ngờ

Giải mã thí nghiệm stress test thực tế trên máy chủ DigitalOcean 12 USD (1 vCPU, 2GB RAM): bài toán gánh tải cho 2.500 đến 5.200 concurrent users, vạch trần điểm nghẽn CPU và bài học tối ưu kiến trúc trước khi vội vã lên Kubernetes.

Khuyên Dùng Engineering Team

DevOps & Cloud Architect
Kinh nghiệm vận hành hạ tầng High Concurrency • Chuyên sâu Benchmark k6 & Database Optimization
Cập nhật: Tháng 10/2026
Thời gian đọc: 14 phút (~3.200 từ)

TL;DR: Tóm Tắt Nhanh Kết Quả Thử Nghiệm

Đừng over-engineering hạ tầng khi bạn chưa khai thác hết 10% phần cứng


  • Cấu hình mặc định (Zero Cache): 1 vCPU, 2GB RAM gánh mượt mà 2.500 active users cùng lúc (~232 Requests/Second), phục vụ 100.000 requests liên tục với tỷ lệ lỗi 0%.

  • In-Memory Cache (Node.js): Đưa năng lực chịu tải lên 4.000 active users; P95 latency giảm ngoạn mục từ 4,5 giây xuống chỉ còn 260ms.

  • Nginx Reverse Proxy Cache: Trụ vững 5.200 active users đồng thời mà không tốn thêm 1 xu chi phí server; riêng endpoint Feed đạt trên 10.000 RPS.

  • Nút thắt cổ chai thực sự: Điểm gãy sập hệ thống là CPU chạm ngưỡng 99%. RAM (dưới 1GB) và PostgreSQL I/O hoàn toàn dư dả nếu cơ sở dữ liệu được đánh index bài bản.

Nội Dung Khảo Sát Kỹ Thuật Chi Tiết

  1. Bẫy tâm lý “Over-engineering” & Đặt lại bài toán VPS 12 USD
  2. Thiết lập môi trường: Cấu hình phần cứng, Stack Monolith & 500k bản ghi
  3. Kịch bản thử nghiệm tải thực tế bằng k6: Không đơn thuần là spam request
  4. Kết quả đo lường nguyên bản: 1.000, 2.000 và điểm gãy tại 4.000 users
  5. Chiến lược tối ưu Caching 2 tầng: Nâng trần tải lên 5.200 active users
  6. Bài học kiến trúc: Định luật Little, chi phí hạ tầng và triết lý Monolith
  7. Video phân tích thực chứng & Bảng công cụ DevOps cần trang bị

1. Bẫy Tâm Lý “Over-Engineering” & Đặt Lại Bài Toán VPS 12 USD

Trong cộng đồng lập trình hiện nay, tồn tại một hiện tượng tâm lý rất phổ biến: Hội chứng lo sợ thiếu quy mô (Premature Scaling). Một dự án khởi nghiệp vừa mới nhen nhóm ý tưởng, chưa có nổi 50 người dùng thường xuyên, nhưng nhóm kỹ sư đã vội vã thiết kế cụm microservices phức tạp trên AWS, dựng cụm Kubernetes nhiều node, cài đặt Kafka để truyền thông điệp, tách riêng Redis cluster và đăng ký các dịch vụ cơ sở dữ liệu serverless đắt đỏ.

Hậu quả là chi phí hóa đơn đám mây (Cloud bill) đội lên hàng trăm, thậm chí hàng ngàn USD mỗi tháng, trong khi sự phức tạp về mặt vận hành khiến tốc độ phát triển tính năng mới bị kéo chậm lại đáng kể. Nhưng liệu chúng ta có thực sự cần những kiến trúc “khổng lồ” đó ngay từ đầu?

“Một chiếc máy chủ ảo hóa cơ bản có giá vỏn vẹn 12 USD mỗi tháng (tương đương 300.000 VNĐ) có thể đi xa đến đâu trước khi sụp đổ? Câu trả lời từ bài kiểm tra tải sẽ khiến nhiều kỹ sư phải nhìn lại toàn bộ các giả định về kiến trúc của mình.”

Dưới đây là bản phân tích chi tiết từ một thử nghiệm benchmark do kỹ sư hệ thống Arjay McCandless thực hiện, tái hiện chính xác sức chịu tải của một cỗ máy phần cứng giá rẻ khi đối mặt với mô phỏng người dùng thật.

2. Thiết Lập Môi Trường: Cấu Hình Phần Cứng, Stack Monolith & 500k Bản Ghi

Để đảm bảo tính khách quan và phản ánh đúng thế giới thực, bài test không sử dụng các đoạn mã “Hello World” rỗng tuếch mà xây dựng một ứng dụng mạng xã hội thu nhỏ (tương tự bảng tin của Twitter hay Instagram):

Đặc Tả Cấu Hình Môi Trường Thử Nghiệm

Phần Cứng Target VPS (DigitalOcean):
  • • Giá thuê: 12 USD/tháng (~300.000 VNĐ)
  • • Vi xử lý: 1 vCPU (Shared Intel/AMD)
  • • Bộ nhớ trong: 2 GB RAM
  • • Ổ lưu trữ: 50 GB NVMe SSD
  • • Hệ điều hành: Ubuntu 24.04 LTS
Kiến Trúc Phần Mềm (All-in-One Monolith):
  • • Reverse Proxy: Nginx (xử lý SSL, keep-alive)
  • • Backend Runtime: Node.js (Express framework)
  • • Cơ sở dữ liệu: PostgreSQL (cùng chạy trên localhost)
  • • Kiến trúc phụ trợ: Không Docker, không Redis rời, không CDN trung gian.

Cơ sở dữ liệu không hề trống rỗng. Trước khi bắt đầu bắn tải, hệ thống được nạp sẵn một lượng dữ liệu mô phỏng tương đương một ứng dụng đã có người dùng thật sự:

  • 50.000 tài khoản người dùng (users table).
  • 500.000 bài viết (posts table).
  • Hơn 2.000.000 lượt tương tác yêu thích (likes table).
  • Tổng dung lượng dữ liệu trên đĩa vào khoảng 360 MB.

Mọi bảng dữ liệu đều được thiết lập các chỉ mục (indexes) bài bản cho khóa chính, khóa ngoại và các trường truy vấn lọc thời gian. Điều này cực kỳ quan trọng, bởi vì một cơ sở dữ liệu thiếu index sẽ sập ngay ở request thứ 50 do phải quét toàn bộ bảng (Full Table Scan), chứ không thể đo lường được giới hạn thực sự của phần cứng.

3. Kịch Bản Thử Nghiệm Tải Bằng k6: Không Đơn Thuần Là Spam Request

Nhiều bài benchmark sai lầm khi sử dụng các công cụ như ApacheBench (ab) hay wrk để “dội bom” 10.000 request tĩnh vào một endpoint duy nhất trong vòng 1 giây. Đó không phải là cách con người sử dụng ứng dụng web.

Trong thử nghiệm này, tác giả sử dụng một máy chủ chuyên dụng riêng biệt (4 vCPU, 8GB RAM, đặt cùng datacenter để độ trễ mạng dưới 1ms) chạy k6 framework của Grafana để mô phỏng hành vi lướt web tự nhiên (Virtual Users – VUs):

Vòng Đời Một Hành Vi Người Dùng Ảo (Virtual User Journey)

Bước 1
Tải trang Feed (GET /feed): Gọi danh sách các bài viết mới nhất kèm số lượt like và thông tin tác giả. Sau đó dừng lại (sleep) từ 3 đến 7 giây để giả lập việc người dùng đọc lướt qua màn hình.
Bước 2
Xem chi tiết bài viết (GET /posts/:id): Bấm vào một bài cụ thể, đọc nội dung chi tiết. Tiếp tục dừng lại từ 3 đến 8 giây.
Bước 3
Tương tác ghi dữ liệu (POST): Có xác suất 15% người dùng sẽ bấm thả tim (POST /like) và xác suất 2% người dùng đăng một bài viết mới (POST /create).
Bước 4
Chờ chu kỳ tiếp theo: Chờ ngẫu nhiên từ 5 đến 15 giây trước khi lặp lại toàn bộ quá trình. Mỗi user đều sở hữu token xác thực JWT (JSON Web Token) riêng biệt.

Trung bình, một người dùng thật mất khoảng 20 đến 25 giây để hoàn tất một chu kỳ lướt nội dung, tạo ra xấp xỉ $0,08$ đến $0,1$ request mỗi giây.

Theo Định luật Little trong lý thuyết hàng đợi viễn thông:

N=λ×W

Trong đó $N$ là số lượng người dùng đồng thời trong hệ thống (Concurrent Users), $lambda$ là tốc độ request đến (Arrival Rate / RPS), và $W$ là tổng thời gian lưu lại trong hệ thống bao gồm cả thời gian suy nghĩ (Think time). Với $W approx 20text{s}$, nếu có 2.500 users đồng thời, lượng request thực tế dội vào máy chủ sẽ rơi vào khoảng:

đếồảááụRPS≈250020≈125 đến 250 req/s (bao gồm cả các tác vụ ghi DB)

Tiêu chí đánh giá hệ thống “còn sống” và đạt chuẩn SLA:

  • Độ trễ trung vị (Median / P50): Dưới 50ms.
  • Độ trễ phân vị thứ 95 (P95 latency): Dưới 500ms.
  • Độ trễ phân vị thứ 99 (P99 latency): Dưới 1.000ms (1 giây).
  • Tỷ lệ lỗi (Error rate / HTTP 5xx): Dưới 1%.

4. Kết Quả Đo Lường Nguyên Bản: Điểm Gãy Tại 4.000 Users & Vạch Trần Nút Thắt

Bắt đầu tăng dần lượng Virtual Users trên cấu hình nguyên bản (Vanilla – chưa có bất kỳ cơ chế caching nào):

Mức Tải Concurrent Users Tần Suất Request (RPS) Median (P50) P95 Latency P99 Latency Tình Trạng
1.000 Users ~83 RPS 5 ms 19 ms 50 ms Cực kỳ mượt mà
2.000 Users ~166 RPS 6 ms 161 ms 276 ms Hoàn toàn ổn định
2.500 Users (Ngưỡng Tối Ưu) ~232 RPS 8 ms 185 ms 410 ms Điểm cân bằng SLA
4.000 Users (Quá Tải) ~360 RPS 2.700 ms 4.500 ms 12.800 ms Sập hệ thống (Timeout)

Thủ phạm gây sập hệ thống là ai?

Khi máy chủ bắt đầu nghẽn ở mốc 4.000 users, hầu hết các lập trình viên sẽ đoán rằng: “Chắc chắn là do PostgreSQL ngốn hết RAM” hoặc “Ổ SSD bị tắc I/O do ghi log liên tục”. Nhưng dữ liệu giám sát trực tiếp từ htop và vmstat lại đưa ra kết luận hoàn toàn trái ngược:

Mức Tiêu Thụ RAM
~850 MB / 2.000 MB

Hơn 1,1 GB RAM vẫn hoàn toàn rảnh rỗi. Hệ điều hành thậm chí không cần đụng tới phân vùng Swap.

Ổ Cứng & I/O Wait
< 1,5% iowait

Các câu truy vấn đều đánh đúng B-Tree Index nên PostgreSQL chỉ đọc từ Buffer Cache, không phải đọc đĩa vật lý liên tục.

Tải Vi Xử Lý (CPU)
99,8% BÃO HÒA

1 vCPU duy nhất bị vắt kiệt để xử lý mã hóa TLS/SSL trên Nginx, Event Loop tuần tự của Node.js và phân tích cú pháp SQL.

Khi CPU chạm trần 100%, hàng đợi request (request queue) bắt đầu dồn ứ lại. Node.js vốn dĩ vận hành trên mô hình đơn luồng (Single-threaded Event Loop). Khi các tác vụ mã hóa JSON, kiểm tra chữ ký JWT và dựng câu query SQL chiếm trọn CPU, các request mới đến không được tiếp nhận kịp, dẫn đến hiệu ứng tuyết lở (cascading failure) và làm nổ tung độ trễ P99 lên 13 giây.

Tuy nhiên, hãy nhìn vào con số ấn tượng: 2.500 active users đồng thời ở trạng thái mặc định hoàn toàn ổn định. Với chu kỳ phiên truy cập thông thường của một ứng dụng tiêu dùng, 2.500 người dùng trực tuyến cùng một giây tương đương với 30.000 đến 60.000 Daily Active Users (DAU) — một quy mô mà 95% các dự án phần mềm startup phải mất nhiều năm mới mơ tới!

5. Chiến Lược Tối Ưu Caching 2 Tầng: Chạm Ngưỡng 5.200 Active Users

Thay vì ngay lập tức bỏ thêm tiền để nâng cấp lên gói VPS 4 vCPU đắt tiền hơn, tác giả thực hiện kỹ thuật kinh điển trong tối ưu hóa hệ thống: Đưa dữ liệu vào bộ nhớ đệm (Caching) càng gần người dùng càng tốt.

Cấp Độ 1: In-Memory Caching Ngay Trong Node.js Process

Tăng tải +60%

Endpoint GET /feed là tài nguyên được đọc nhiều nhất trong hệ thống (chiếm hơn 70% tổng lượng truy vấn). Tác giả tạo một bộ nhớ đệm đơn giản ngay trong RAM của Node.js với thời gian sống (TTL) là 5 giây. Mọi người dùng trong vòng 5 giây đó đều nhận chung một danh sách bài viết mà Node.js không cần phải mở kết nối đến PostgreSQL.

• Kết quả đo lường: Hệ thống vượt qua mốc 2.500 users và chịu tải trơn tru ở 4.000 active users đồng thời.
• Độ trễ P95: Giảm thần kỳ từ 4.500 ms xuống còn 260 ms tại mốc 4.000 users.
• Độ trễ P99: Hạ từ mức nghẽn 12,8 giây về mức an toàn 1.050 ms.

Cấp Độ 2: Đẩy Cache Ra Tầng Nginx Reverse Proxy (Microcaching)

Tăng tải +108%

Mặc dù in-memory cache giúp giải phóng PostgreSQL, nhưng request vẫn phải đi qua Event Loop của Node.js để phân giải logic. Tác giả tiến thêm một bước: Cấu hình proxy_cache trực tiếp trên Nginx với thời gian TTL 2 giây.

• Nguyên lý: Nginx được viết bằng C, tối ưu hóa I/O cực mạnh. Khi request feed đến, Nginx trả lời ngay lập tức từ bộ nhớ đệm mà không cần chuyển tiếp (forward) socket vào runtime Node.js.
• Hiệu năng Endpoint Feed: Tăng vọt từ 280 RPS (nguyên bản) lên 1.200 RPS (Node cache) và vượt mốc 10.000 RPS khi cache tại Nginx!
• Tải toàn diện k6: Chiếc máy chủ 12 USD trụ vững ở con số không tưởng: 5.200 active users đồng thời với P95 chỉ 160 ms và P99 chỉ 474 ms!

Kiến Trúc Triển Khai Max Concurrent Users (SLA) Feed Endpoint Max RPS P95 Latency Tại Đỉnh Chi Phí Server Hàng Tháng
1. Vanilla (Chưa Cache) 2.500 users ~280 RPS 185 ms 12 USD
2. In-Memory Cache (Node.js) 4.000 users ~1.200 RPS 260 ms 12 USD
3. Nginx Proxy Cache 5.200 users > 10.000 RPS 160 ms 12 USD (+0 USD)

Video Benchmark VPS 12 USD DigitalOcean bằng k6



Thực Chứng Benchmark Kỹ Thuật

How Many Users Can a $12 Server Handle?

Theo dõi chi tiết quy trình setup k6 script, theo dõi htop CPU bão hòa và kết quả đo lường độ trễ trên kênh Arjay McCandless.

6. Bài Học Kiến Trúc: Monolith Tối Ưu vs Microservices Sớm

Thử nghiệm trên mang lại những đúc kết vô giá cho bất kỳ Tech Lead hay Software Engineer nào đang phân vân lựa chọn cấu trúc hạ tầng cho sản phẩm của mình:

1. Phần cứng rẻ ngày nay mạnh hơn bạn tưởng

Một lõi vi xử lý ảo hóa hiện đại có thể xử lý hàng triệu lệnh mỗi giây. Với các ứng dụng web thông thường (CRUD, đọc feed, tương tác, mua hàng), nếu bạn không xử lý render video hay huấn luyện mô hình trí tuệ nhân tạo cục bộ, một chiếc máy chủ 10–20 USD hoàn toàn đủ sức gánh vác cả giai đoạn Product-Market Fit cho đến khi startup kiếm được doanh thu thực.

2. Đánh chỉ mục (Indexing) là vũ khí tối thượng

Lý do PostgreSQL không làm nghẽn máy chủ dù chứa 2 triệu lượt like là vì các trường user_id, post_id và created_at đều có index. Nếu không có index, CPU sẽ kiệt quệ ở tầng cơ sở dữ liệu thay vì tầng runtime của ứng dụng.

3. Vận dụng nguyên lý “Cache gần nhất có thể”

Đừng vội mua cụm Redis độc lập tốn 30 USD/tháng khi bạn chưa tận dụng bộ nhớ đệm Nginx (Microcaching). Nginx xử lý nội dung tĩnh và nội dung cache trong RAM với chi phí tài nguyên gần như bằng 0, bảo vệ toàn bộ backend phía sau khỏi những cơn bão lưu lượng đột ngột.

7. Bảng Học Liệu Thiết Yếu, Sách System Design & FAQ Kỹ Thuật

Dành cho các kỹ sư phần mềm muốn nâng cao năng lực thiết kế hệ thống chịu tải cao và làm chủ các kỹ thuật tối ưu hóa hiệu năng chuyên sâu:

Tài Liệu / Công Cụ Đào Tạo Ứng Dụng Thực Tiễn Trình Độ Phù Hợp Lợi Ích Khi Triển Khai Hạ Tầng Tra Cứu Shopee
1. Sách System Design Interview (Alex Xu) Nắm vững nguyên lý Scale-up, Caching, Rate Limiting & Message Queue. Junior & Mid Backend Tránh sai lầm thiết kế kiến trúc quá tải ban đầu. Xem Shopee
2. Sách Designing Data-Intensive Applications (Martin Kleppmann) Hiểu tường tận về cơ chế Replication, Partitioning & Transaction của Database. Senior & Architect Bảo toàn tính nhất quán dữ liệu khi tải bùng nổ. Xem Shopee
3. Giáo Trình Nginx & HTTP/2 High Performance Cấu hình chi tiết FastCGI Cache, SSL termination, Buffering & Rate limit. DevOps & Sysadmin Tối ưu Nginx để gánh hàng chục ngàn RPS dễ dàng. Xem Shopee
4. Thẻ Quà Tặng VPS Cloud Server (DigitalOcean / Linode) Trải nghiệm môi trường máy chủ thực tế để tự tay chạy k6 load test. Mọi cấp độ lập trình Thực hành trực quan, kiểm chứng giới hạn ứng dụng. Xem Shopee

Hỏi Đáp Kỹ Thuật Chuyên Sâu (FAQ)

Tại sao không sử dụng Docker trong bài thử nghiệm này?

Việc chạy trực tiếp trên hệ điều hành máy chủ (Bare-metal style) giúp loại bỏ hoàn toàn các lớp trung gian (overhead) về mạng bridge của Docker và daemon memory. Trên các gói VPS cấu hình siêu nhỏ (1 vCPU, 2GB RAM), việc tiết kiệm từng chu kỳ xung nhịp và megabyte RAM là yếu tố quyết định để xác định chính xác năng lực thuần của phần cứng.

Nếu ứng dụng có nhiều tác vụ ghi (Write-heavy) thì kết quả có thay đổi không?

Chắc chắn có. Các tác vụ ghi (Insert, Update, Delete) bắt buộc phải qua cơ chế Transaction Log (WAL) của PostgreSQL và không thể áp dụng Nginx Proxy Cache đơn giản. Tuy nhiên, trong 90% ứng dụng thực tế (Facebook, Twitter, Báo điện tử, E-commerce), tỷ lệ Đọc/Ghi (Read/Write Ratio) thường là 80:20 hoặc 90:10. Vì vậy bài thử nghiệm với 15% like và 2% tạo bài viết phản ánh rất sát điều kiện vận hành thực tế.

Khi nào thì một startup thực sự cần chuyển đổi sang Microservices?

Microservices sinh ra không phải để giải quyết vấn đề hiệu năng thuần túy, mà là để giải quyết bài toán quy mô nhân sự (Organizational Scaling). Bạn chỉ nên cân nhắc microservices khi quy mô đội ngũ kỹ thuật vượt qua 20–30 lập trình viên và việc deploy một monolith gây xung đột mã nguồn liên tục, hoặc khi các module riêng biệt có nhu cầu co giãn phần cứng hoàn toàn trái ngược nhau.

Nguồn tài liệu phân tích & Tham chiếu kỹ thuật nguyên bản:

Nguồn tài liệu 1: https://khuyendung.net/cong-nghe/how-many-users-can-a-12-dollar-server-handle-arjay-mccandless-benchmark

Nguồn tài liệu 2: https://khuyendung.net/cong-nghe/k6-load-testing-best-practices-virtual-users-and-arrival-rate-simulation

Nguồn tài liệu 3: https://khuyendung.net/cong-nghe/toi-uu-hoa-nginx-microcaching-va-giam-tai-node-js-event-loop

Nguồn tài liệu 4: https://khuyendung.net/cong-nghe/danh-gia-hieu-nang-postgresql-indexing-va-buffer-cache-tren-vps-gia-re

Nguồn tài liệu 5: https://khuyendung.net/cong-nghe/dinh-luat-little-trong-kien-truc-he-thong-va-tinh-toan-concurrent-users

Contents hide
1 VPS 12 USD Chịu Tải Bao Nhiêu Users? Benchmark K6 Bất Ngờ
Back to top button