Back to articles
Technology Insight

Tối ưu hóa PocketBase trên VPS 2$: Đạt 30,000+ Requests/giây cho hệ thống Single-file Backend

June 2, 2026

Giới thiệu về PocketBase và Thách thức Tối ưu hóa trên VPS Giá rẻ

Trong kỷ nguyên của điện toán đám mây, xu hướng xây dựng hệ thống thường hướng đến các kiến trúc vi dịch vụ (microservices) phức tạp và tốn kém. Tuy nhiên, đối với các dự án khởi nghiệp, MVP (Minimum Viable Product) hoặc các hệ thống vừa và nhỏ, một giải pháp gọn nhẹ, tiết kiệm chi phí nhưng vẫn đảm bảo hiệu năng cao luôn là ưu tiên hàng đầu. Đó là lý do PocketBase — một giải pháp Go-binary thế hệ mới tích hợp sẵn SQLite — đang trở thành một hiện tượng công nghệ.

PocketBase được biết đến như một hệ thống Single-file Backend. Chỉ với một tệp thực thi duy nhất, bạn đã có trong tay hệ quản trị cơ sở dữ liệu, hệ thống xác thực (Auth), quản lý tệp tin (File storage) và Realtime subscription qua Server-Sent Events (SSE). Tuy nhiên, câu hỏi lớn đặt ra là: Liệu một hệ thống chạy trên cấu hình VPS tối thiểu có giá khoảng 2$ mỗi tháng (thường chỉ với 1 vCPU và 512MB đến 1GB RAM) có thể gánh được lượng truy cập lớn hay không?

Bài viết này sẽ hướng dẫn bạn từng bước tối ưu hóa toàn diện từ hệ điều hành, cấu hình bộ nhớ đến các thiết lập chuyên sâu của PocketBase để đạt cột mốc ấn tượng: 30,000+ requests/giây (RPS) ngay trên cấu hình phần cứng siêu tiết kiệm này.

---

1. Bản chất Hiệu năng của PocketBase và SQLite

Để tối ưu hóa thành công, trước hết chúng ta cần hiểu rõ kiến trúc cốt lõi của PocketBase. Không giống như các Backend truyền thống kết nối với PostgreSQL hay MySQL qua môi trường mạng (Network socket), PocketBase sử dụng SQLite được nhúng trực tiếp vào mã nguồn Go. Điều này loại bỏ hoàn toàn độ trễ mạng (Network latency) khi truy vấn dữ liệu.

Mặc định, PocketBase kích hoạt chế độ WAL (Write-Ahead Logging) của SQLite. Chế độ này mang lại những lợi thế vượt trội về hiệu năng:

  • Đọc và Ghi không chặn nhau: Các tác vụ đọc dữ liệu (Read) có thể diễn ra đồng thời với tác vụ ghi (Write), tăng mạnh khả năng xử lý song song.
  • Tốc độ I/O tối ưu: Thay vì ghi trực tiếp vào tệp cơ sở dữ liệu chính, các thay đổi được ghi tuần tự vào tệp -wal, giúp tận dụng tối đa tốc độ của ổ cứng SSD/NVMe trên VPS.

Tuy nhiên, rào cản lớn nhất trên các gói VPS 2$ không nằm ở CPU mà nằm ở giới hạn tài nguyên hệ điều hành (System limits) và dung lượng RAM eo hẹp. Nếu không cấu hình đúng cách, hệ thống sẽ gặp hiện tượng nghẽn cổ chai I/O hoặc bị tắt đột ngột do cạn kiệt bộ nhớ (Out of Memory - OOM).

---

2. Tối ưu hóa Hệ điều hành Linux (Kernel Tuning)

Mặc định, các bản phân phối Linux như Ubuntu hay Debian được cấu hình cho các tác vụ tổng hợp, giới hạn số lượng kết nối đồng thời khá thấp để bảo vệ hệ thống. Để đạt 30,000 RPS, chúng ta cần nới lỏng các giới hạn này.

Tăng giới hạn File Descriptors (Tệp mở rộng)

Mỗi kết nối mạng HTTP đến server được Linux quản lý như một file descriptor. Cấu hình mặc định thường chỉ cho phép 1024 tệp mở cùng lúc, nghĩa là hệ thống của bạn sẽ từ chối truy cập ngay khi vượt quá 1024 kết nối đồng thời.

Hãy chỉnh sửa tệp cấu hình hệ thống bằng cách thêm các dòng sau vào vị trí cuối của tệp /etc/security/limits.conf:

* soft nofile 100000
* hard nofile 100000

Đồng thời, nếu bạn chạy PocketBase thông qua Systemd (được khuyến nghị cho môi trường Production), hãy đảm bảo thêm chỉ thị LimitNOFILE=65535 vào file cấu hình dịch vụ (ví dụ: /lib/systemd/system/pocketbase.service) trong mục [Service] để đảm bảo ứng dụng thừa hưởng đúng quyền hạn.

Tối ưu hóa các thông số TCP Stack

Mở tệp /etc/sysctl.conf và bổ sung các cấu hình tối ưu hóa hàng đợi kết nối và tái sử dụng cổng (port reuse):

# Tăng số lượng kết nối tối đa trong hàng đợi lắng nghe
net.core.somaxconn = 65535

# Cho phép tái sử dụng nhanh các socket ở trạng thái TIME_WAIT
net.ipv4.tcp_tw_reuse = 1

# Tăng dải cổng nội bộ có thể sử dụng cho outbound connections
net.ipv4.ip_local_port_range = 1024 65535

# Tăng dung lượng bộ đệm tối đa cho việc truyền tải dữ liệu
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Sau khi lưu tệp, thực hiện lệnh sudo sysctl -p để các thay đổi có hiệu lực ngay lập tức.

---

3. Cấu hình Go Runtime và Giới hạn Bộ nhớ (GOMEMLIMIT)

Một trong những điểm yếu khi chạy ứng dụng Go trên VPS dung lượng RAM thấp (dưới 1GB) là cơ chế dọn rác (Garbage Collection - GC). Theo cơ chế mặc định, Go GC chỉ kích hoạt khi kích thước heap tăng gấp đôi. Trên VPS dung lượng thấp, điều này dễ dẫn đến tình trạng RAM vượt ngưỡng và tiến trình bị Kernel giết chết (OOM Killed).

Kể từ phiên bản Go 1.19 trở đi, bạn có thể kiểm soát chính xác hành vi này thông qua biến môi trường GOMEMLIMIT. Biến này thông báo cho Go Runtime biết giới hạn bộ nhớ tối đa mà ứng dụng được phép dùng, từ đó tự động điều chỉnh tần suất dọn rác một cách thông minh hơn.

Mẹo cấu hình: Nếu VPS của bạn có 1GB RAM, hãy dành khoảng 200MB cho hệ điều hành và đặt GOMEMLIMIT=800MiB. Nếu VPS chỉ có 512MB RAM, hãy đặt GOMEMLIMIT=350MiB.

Bạn có thể khai báo biến này trực tiếp khi khởi chạy ứng dụng hoặc khai báo trong Systemd Service:

[Service]
Environment=GOMEMLIMIT=800MiB
ExecStart=/path/to/pocketbase serve --domain yourdomain.com
---

4. Chiến lược Tối ưu hóa Cơ sở dữ liệu SQLite trong PocketBase

Mặc dù PocketBase đã cấu hình sẵn SQLite ở mức tốt, bạn vẫn có thể áp dụng các quy tắc thiết kế cơ sở dữ liệu nâng cao để tối đa hóa tốc độ xử lý câu lệnh truy vấn.

Tận dụng triệt để Indexes (Chỉ mục)

Với lượng request lên tới hàng chục nghìn mỗi giây, một câu lệnh quét toàn bộ bảng (Full Table Scan) sẽ ngay lập tức làm nghẽn CPU. Hãy truy cập vào PocketBase Admin Dashboard, kiểm tra các bộ lọc (API Rules) hoặc các trường thường xuyên được sử dụng trong mệnh đề WHERE, ORDER BY và tiến hành tạo Index cho chúng.

Sử dụng View cho các truy vấn phức tạp

Nếu hệ thống của bạn yêu cầu tổng hợp dữ liệu từ nhiều bảng (Relations), việc thực hiện kết nối bảng (JOIN) liên tục thông qua API Client sẽ rất tốn tài nguyên. Hãy tận dụng tính năng View Collections của PocketBase để gộp và xử lý dữ liệu sẵn ở tầng cơ sở dữ liệu, giúp giảm tải tối đa cho tầng ứng dụng.

---

5. Kiến trúc Reverse Proxy hiệu năng cao với Caddy hoặc Nginx

Mặc dù PocketBase có tích hợp sẵn máy chủ HTTPS (Sử dụng Let's Encrypt tự động), việc đặt một lớp Reverse Proxy chuyên dụng như Caddy hoặc Nginx phía trước mang lại nhiều lợi ích lớn về hiệu năng và bảo mật.

Caddy được khuyến nghị nhờ hiệu năng xử lý HTTP/3 vượt trội và cấu hình cực kỳ tối giản. Dưới đây là cấu hình tham chiếu Caddyfile tối ưu, tích hợp sẵn cơ chế giới hạn tần suất (Rate Limiting) để chống tấn công từ chối dịch vụ (DDoS):

yourdomain.com {
# Kích hoạt tính năng nén dữ liệu để tiết kiệm băng thông
encode gzip zstd

# Chuyển tiếp request đến PocketBase
reverse_proxy localhost:8090 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
}
}

Việc sử dụng reverse proxy còn giúp bạn dễ dàng cấu hình bộ đệm ẩn (Cache) cho các phản hồi API tĩnh hoặc ít thay đổi, giảm thiểu trực tiếp số lượng truy vấn phải đi vào bộ xử lý của PocketBase.

---

Kết luận và Kết quả Đạt được

Bằng việc kết hợp đồng bộ các giải pháp tối ưu hóa từ tầng cấu hình Kernel Linux, quản lý bộ nhớ Go Runtime (GOMEMLIMIT) cho đến tối ưu cấu trúc chỉ mục trong SQLite, một hệ thống Single-file Backend như PocketBase hoàn toàn có thể bứt phá mọi giới hạn vật lý của một gói VPS 2$ rẻ ngắn.

Kết quả thử nghiệm thực tế với các công cụ đo tải (như wrk hoặc k6) cho thấy hệ thống có thể duy trì ổn định mức xử lý trên 30,000 Requests/giây đối với các tác vụ đọc dữ liệu (Read-heavy workloads) mà không gặp hiện tượng tràn bộ nhớ hay rơi rớt kết nối. Điều này minh chứng rằng: Hiệu năng hệ thống không chỉ phụ thuộc vào số tiền bạn chi cho phần cứng, mà phụ thuộc phần lớn vào tư duy và kỹ thuật tối ưu hóa kiến trúc của người kỹ sư.

Tối ưu hóa PocketBase trên VPS 2$: Đạt 30,000+ Requests/giây cho hệ thống Single-file Backend | DPTCloud