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 1, 2026

Giới thiệu xu hướng Single-file Backend và Sức mạnh từ PocketBase

Trong kỷ nguyên của kiến trúc vi dịch vụ (Microservices) phức tạp và hạ tầng điện toán đám mây đắt đỏ, xu hướng giản lược hóa kiến trúc phần mềm đang trở lại mạnh mẽ. PocketBase nổi lên như một hiện tượng trong cộng đồng phát triển nhờ triết lý Single-file Backend — tích hợp toàn bộ cơ sở dữ liệu SQLite, hệ thống xác thực (Auth), quản lý tệp tin và Realtime Subscriptions vào trong một tệp thực thi duy nhất bằng ngôn ngữ Go.

Nhiều nhà quản lý hạ tầng thường hoài nghi về khả năng chịu tải của SQLite và các giải pháp nguyên khối nhỏ gọn khi triển khai trên các dòng máy chủ ảo (VPS) cấu hình thấp. Tuy nhiên, với các kỹ thuật tối ưu hóa chuyên sâu, một máy chủ VPS có mức giá chỉ khoảng 2$/tháng hoàn toàn có thể xử lý hơn 30,000+ Requests/giây (RPS) cho các tác vụ đọc/ghi hỗn hợp. Bài viết này sẽ phân tích chi tiết chiến lược nâng cấp hiệu năng PocketBase từ cấp độ hệ điều hành, cấu hình bộ nhớ đến tinh chỉnh tầng lưu trữ dữ liệu để đạt tới giới hạn vận hành tối đa.

---

1. Tối ưu hóa tầng Hệ điều hành (OS-level Tuning)

Mặc định, các bản phân phối Linux như Ubuntu hay Debian được cấu hình an toàn cho mục đích phổ thông, vô tình tạo ra các rào cản tài nguyên đối với một hệ thống xử lý lượng kết nối lớn đồng thời (High Concurrency).

Tăng giới hạn File Descriptors (Ulimit)

Mỗi kết nối mạng vào PocketBase được hệ điều hành quản lý như một tệp tin (File Descriptor). Giới hạn mặc định thường là 1024, gây ra lỗi nghiêm trọng too many open files khi lượng người dùng tăng cao. Cần cấu hình lại tệp tin /etc/security/limits.conf:

* soft nofile 65535
* hard nofile 65535

Cấu hình lại các tham số TCP trong Kernel Linux

Để tối ưu hóa tốc độ giải phóng socket và tăng hàng đợi kết nối, hãy bổ sung các thiết lập sau vào tệp /etc/sysctl.conf và áp dụng bằng lệnh sudo sysctl -p:

  • net.core.somaxconn = 32768: Tăng độ dài tối đa của hàng đợi lắng nghe kết nối TCP.
  • net.ipv4.tcp_max_syn_backlog = 16384: Tăng dung lượng hàng đợi cho các gói tin SYN chưa được xác nhận.
  • net.ipv4.tcp_tw_reuse = 1: Cho phép tái sử dụng nhanh các socket ở trạng thái TIME_WAIT.
  • net.ipv4.ip_local_port_range = 1024 65535: Mở rộng dải cổng local dành cho các kết nối outbound.
---

2. Biên dịch PocketBase với CGO và Trình điều khiển SQLite Chuyên dụng

Theo tài liệu kỹ thuật và các kết quả đo kiểm hiệu năng thực tế từ cộng đồng PocketBase, phiên bản được xây dựng bằng trình điều khiển thuần Go (Pure Go) có độ ổn định cao và dễ dàng cross-compile nhưng bị giới hạn về tốc độ xử lý câu lệnh SQL phức tạp. Để bứt phá giới hạn, việc chuyển dịch sang CGO là bắt buộc.

Việc biên dịch PocketBase kèm cờ CGO_ENABLED=1 và tích hợp driver [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) giúp hiệu năng truy vấn dữ liệu (SELECT) đối với các tập dữ liệu lớn tăng trưởng từ 1.5x đến 4x lần. Trình điều khiển dựa trên nền tảng ngôn ngữ C tối ưu hóa việc giao tiếp trực tiếp với nhân SQLite, giảm thiểu chi phí chuyển đổi ngữ cảnh (Context Switching) của Go Runtime khi tương tác với hệ thống tệp tin.

Lệnh biên dịch tối ưu hóa tối đa cho kiến trúc CPU hiện đại:

CGO_ENABLED=1 GOAMD64=v3 go build -ldflags="-s -w" -o pocketbase main.go
---

3. Tinh chỉnh cấu hình SQLite và PocketBase Engine

Bản chất sức mạnh của PocketBase nằm ở cách cấu hình công cụ lưu trữ SQLite. Chế độ mặc định của SQLite phục vụ tính an toàn dữ liệu tuyệt đối hơn là hiệu năng tốc độ cao.

Kích hoạt Write-Ahead Logging (WAL Mode)

PocketBase tự động kích hoạt chế độ WAL. Khác với mô hình khóa truyền thống (Rollback Journal) vốn chặn toàn bộ tiến trình đọc khi có một tiến trình ghi đang diễn ra, chế độ WAL cho phép nhiều tiến trình đọc đồng thời thực thi song song với một tiến trình ghi. Đây là chìa khóa then chốt giúp hệ thống chịu tải hàng chục nghìn request cùng lúc.

Tối ưu các biến môi trường của Database Connection Pool

Để tận dụng tối đa phần cứng hạn chế của VPS 2$, số lượng kết nối đồng thời vào cơ sở dữ liệu cần được kiểm soát chặt chẽ để tránh cạn kiệt RAM và xung đột luồng xử lý. Thực hiện tinh chỉnh các tham số kết nối thông qua mã nguồn mở rộng (Go Framework) hoặc biến cấu hình:

  • MaxOpenConns: Giới hạn tối đa khoảng 60–120 kết nối tùy thuộc vào số lượng lõi CPU ảo (vCPU) của VPS để tránh tranh chấp I/O đĩa cứng.
  • MaxIdleConns: Duy trì từ 15–30 kết nối nhàn rỗi trong pool để giảm chi phí khởi tạo lại kết nối cho các request tiếp theo.

Sử dụng tham số skipTotal=1 trong API Requests

Trong các phiên bản PocketBase, khi thực hiện truy vấn danh sách bản ghi qua API, hệ thống mặc định thực hiện một câu lệnh COUNT bổ sung để tính toán tổng số trang dữ liệu. Đối với các bảng dữ liệu lớn, thao tác này tiêu tốn rất nhiều tài nguyên CPU. Việc thêm tham số ?skipTotal=1 vào URL API sẽ triệt tiêu hoàn toàn câu lệnh này, giảm thời gian phản hồi từ ~3.5 giây xuống chỉ còn dưới 9ms đối với tập dữ liệu hàng trăm nghìn bản ghi.

---

4. Chiến lược thiết lập Chỉ mục (Indexes) và Thiết kế Cơ sở Dữ liệu

Dù hệ thống có được tối ưu phần cứng tốt đến đâu, một câu lệnh truy vấn quét toàn bộ bảng (Full Table Scan) sẽ ngay lập tức kéo sập VPS cấu hình thấp khi có tải cao.

Doanh nghiệp cần rà soát lại toàn bộ các trường thường xuyên xuất hiện trong mệnh đề WHERE, ORDER BY, hoặc các trường liên kết quan hệ (Relations) để thiết lập Indexes phù hợp. Cần lưu ý tránh lạm dụng chỉ mục hỗn hợp quá phức tạp đối với các bảng có tần suất ghi dữ liệu cao, vì mỗi thao tác chèn (INSERT) hoặc cập nhật (UPDATE) sẽ buộc SQLite phải tính toán lại cây chỉ mục, làm gia tăng p90 latency.

---

Kết luận và Khuyến nghị Triển khai Thực tế

Giải pháp Single-file Backend với PocketBase trên cấu hình VPS giá rẻ 2$ là một minh chứng rõ ràng cho thấy: Kiến trúc phần mềm thông minh và tinh gọn hoàn toàn có thể chiến thắng bài toán chi phí hạ tầng. Bằng việc áp dụng đồng bộ các giải pháp từ nâng cấp cấu hình mạng Linux Kernel, biên dịch tối ưu hóa CGO, đến tinh chỉnh tham số vận hành SQLite WAL, hệ thống hoàn toàn đảm bảo khả năng xử lý mượt mà hơn 30,000+ requests/giây.

Tuy nhiên, kiến trúc Single-node này có một giới hạn vật lý là khả năng mở rộng theo chiều ngang (Horizontal Scaling). Đối với các hệ thống yêu cầu độ sẵn sàng cao tuyệt đối (High Availability), doanh nghiệp nên tích hợp thêm công cụ Litestream để thực hiện sao lưu trực tuyến (Streaming Replication) dữ liệu SQLite sang các kho lưu trữ dạng Object Storage (S3, Cloudflare R2) theo thời gian thực, đảm bảo an toàn dữ liệu và khả năng khôi phục thảm họa (Disaster Recovery) nhanh chóng.

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