Back to articles
Technology Insight

Tối ưu hóa cơ sở dữ liệu PostgreSQL trên VPS: Top 5 cấu hình cần sửa trong file postgresql.conf để tăng tốc truy vấn

May 29, 2026

Giới thiệu về tối ưu hóa PostgreSQL trên máy chủ ảo (VPS)

Trong kỷ nguyên số hiện nay, dữ liệu là tài sản vô giá của mọi doanh nghiệp. Tuy nhiên, khi quy mô dữ liệu ngày càng lớn, việc hệ thống gặp phải hiện tượng nghẽn cổ chai (bottleneck) hoặc tốc độ truy vấn suy giảm là điều khó tránh khỏi. Đối với các doanh nghiệp đang vận hành hệ quản trị cơ sở dữ liệu PostgreSQL trên môi trường VPS (Virtual Private Server), cấu hình mặc định ban đầu thường được thiết kế để đảm bảo tính an toàn và khả năng tương thích cao nhất, chứ không phải để tối ưu hóa hiệu năng tối đa.

Cấu hình mặc định của PostgreSQL chỉ sử dụng một lượng tài nguyên RAM và CPU cực kỳ khiêm tốn. Nếu bạn giữ nguyên các thông số này trên một VPS có cấu hình mạnh mẽ, hệ thống của bạn sẽ không thể tận dụng hết tiềm năng phần cứng, dẫn đến việc các câu lệnh SELECT, JOIN phức tạp mất nhiều thời gian hơn để xử lý. Để giải quyết bài toán này, việc can thiệp trực tiếp vào file cấu hình chiến lược postgresql.conf là bước đi không thể bỏ qua.

Bài viết này sẽ hướng dẫn bạn chi tiết cách tinh chỉnh Top 5 thông số cấu hình cốt lõi trong file postgresql.conf nhằm bứt phá tốc độ xử lý truy vấn và tối ưu hóa tài nguyên phần cứng một cách hiệu quả nhất.

---

Top 5 cấu hình cần sửa trong file postgresql.conf để tăng tốc truy vấn

Trước khi bắt đầu chỉnh sửa, bạn cần xác định rõ lượng tài nguyên phần cứng hiện có trên VPS của mình (đặc biệt là dung lượng RAM và số lượng nhân CPU). Hãy luôn tạo một bản sao lưu của file postgresql.conf trước khi thực hiện bất kỳ thay đổi nào để đảm bảo an toàn hệ thống.

1. shared_buffers – Bộ nhớ đệm chia sẻ cho dữ liệu

Thông số shared_buffers xác định lượng bộ nhớ RAM chuyên dụng mà PostgreSQL sử dụng để lưu trữ và truy xuất các trang dữ liệu (data pages). Khi một truy vấn yêu cầu dữ liệu, PostgreSQL sẽ kiểm tra trong vùng bộ nhớ đệm này trước. Nếu dữ liệu đã có sẵn trong shared_buffers (gọi là Cache Hit), tốc độ phản hồi sẽ nhanh hơn hàng trăm lần so với việc phải đọc trực tiếp từ ổ đĩa cứng (I/O).

  • Cấu hình mặc định: Thường rất thấp (khoảng 128MB).
  • Khuyến nghị tối ưu: Thiết lập bằng 25% đến 30% tổng dung lượng RAM của VPS.
Ví dụ: Nếu VPS của bạn có 8GB RAM, giá trị lý tưởng cho shared_buffers sẽ dao động trong khoảng 2GB đến 2.5GB. Lưu ý không nên cấu hình thông số này vượt quá 40% RAM vì hệ điều hành cũng cần không gian để quản lý các tiến trình khác và thực hiện cache file (OS cache).

2. effective_cache_size – Ước tính bộ nhớ đệm của toàn hệ thống

Thông số effective_cache_size không trực tiếp phân bổ hay chiếm dụng RAM của hệ thống. Thay vào đó, đây là một chỉ số mang tính chất "thông báo" để bộ tối ưu hóa truy vấn (Query Planner) của PostgreSQL biết được tổng dung lượng bộ nhớ đệm có sẵn (bao gồm cả shared_buffers và bộ nhớ đệm của hệ điều hành Linux) dành cho việc quản lý dữ liệu.

Nếu giá trị này được đặt quá thấp, Query Planner sẽ nghĩ rằng hệ thống có rất ít bộ nhớ và xu hướng chọn các phương án quét toàn bộ bảng (Sequential Scan) thay vì sử dụng Index (Index Scan) – điều này làm giảm nghiêm trọng tốc độ của các câu lệnh tìm kiếm.

  • Khuyến nghị tối ưu: Thiết lập bằng khoảng 50% đến 75% tổng dung lượng RAM của VPS.
  • Ví dụ: Với VPS sở hữu 8GB RAM, bạn nên đặt effective_cache_size = 6GB.

3. work_mem – Bộ nhớ cho các tác vụ sắp xếp và băm dữ liệu

Khác với hai thông số trên áp dụng cho toàn hệ thống, work_mem xác định lượng bộ nhớ RAM tối đa được phân bổ cho mỗi tác vụ nội bộ của một truy vấn (chẳng hạn như các lệnh ORDER BY, DISTINCT, JOIN hoặc các truy vấn con).

Nếu một câu lệnh SQL yêu cầu dung lượng bộ nhớ lớn hơn giá trị work_mem để thực hiện việc sắp xếp dữ liệu, PostgreSQL sẽ buộc phải ghi các tệp tạm thời xuống ổ đĩa cứng. Việc đọc/ghi tệp tạm thời trên ổ đĩa chính là thủ phạm khiến các truy vấn phức tạp trở nên cực kỳ chậm chạp.

  • Cấu hình mặc định: 4MB.
  • Khuyến nghị tối ưu: Từ 32MB đến 128MB tùy thuộc vào độ phức tạp của ứng dụng và số lượng kết nối đồng thời.

Cảnh báo quan trọng: Nếu hệ thống của bạn có 100 kết nối đồng thời và mỗi kết nối chạy một truy vấn phức tạp chứa 4 tác vụ sắp xếp, tổng dung lượng RAM tiêu thụ có thể lên tới: 100 * 4 * work_mem. Do đó, hãy tính toán cẩn thận để tránh rơi vào tình trạng cạn kiệt bộ nhớ hệ thống (Out of Memory - OOM).

4. maintenance_work_mem – Bộ nhớ cho các tác vụ bảo trì hệ thống

Thông số này quản lý dung lượng RAM tối đa được sử dụng cho các hoạt động bảo trì cơ sở dữ liệu lớn, chẳng hạn như lệnh VACUUM, ANALYZE, tạo chỉ mục (CREATE INDEX), và thêm khóa ngoại (Foreign Keys).

Vì các tác vụ bảo trì này thường do quản trị viên hệ thống hoặc tiến trình tự động (Autovacuum) khởi chạy với số lượng phiên giới hạn, bạn có thể cấu hình giá trị này lớn hơn rất nhiều so với work_mem để tăng tốc độ dọn dẹp và tái cấu trúc dữ liệu, giúp giải phóng không gian lưu trữ nhanh hơn.

  • Khuyến nghị tối ưu: Thiết lập bằng khoảng 5% đến 10% tổng dung lượng RAM, hoặc giới hạn tối đa khoảng 1GB đến 2GB đối với các hệ thống lớn.
  • Ví dụ: Với VPS 8GB RAM, đặt maintenance_work_mem = 512MB là một lựa chọn hợp lý.

5. max_worker_processes và max_parallel_workers – Tối ưu hóa truy vấn song song

Trong các phiên bản PostgreSQL hiện đại, tính năng xử lý song song (Parallel Query) cho phép chia nhỏ một truy vấn lớn và tận dụng nhiều nhân CPU cùng lúc để xử lý dữ liệu. Để kích hoạt tối đa sức mạnh của bộ vi xử lý trên VPS, bạn cần tinh chỉnh nhóm thông số sau:

  1. max_worker_processes: Tổng số tiến trình nền tối đa mà hệ thống có thể hỗ trợ. Nên đặt bằng tổng số nhân CPU (vCPU) của VPS.
  2. max_parallel_workers_per_gather: Số lượng worker tối đa có thể tham gia vào một truy vấn song song duy nhất. Thường đặt từ 2 đến 4 tùy thuộc vào số nhân CPU.
  3. max_parallel_workers: Số lượng worker song song tối đa có thể chạy đồng thời trên toàn hệ thống.

Bằng cách cấu hình chính xác các thông số này, các tác vụ quét bảng lớn hoặc tính toán báo cáo tổng hợp sẽ được phân tải đều lên các core CPU, giúp rút ngắn thời gian xử lý từ vài phút xuống còn vài giây.

---

Quy trình áp dụng cấu hình và kiểm tra hiệu năng

Sau khi đã xác định được các con số tối ưu cho cấu hình phần cứng VPS của mình, bạn hãy thực hiện theo các bước sau để áp dụng các thay đổi một cách an toàn:

# Bước 1: Mở file cấu hình bằng nano hoặc vim
sudo nano /etc/postgresql/[version]/main/postgresql.conf

# Bước 2: Tìm và chỉnh sửa 5 thông số đã nêu trên
# Bước 3: Lưu file và kiểm tra cú pháp cấu hình xem có hợp lệ không
sudo -u postgres postgresql-check-db-config

# Bước 4: Khởi động lại dịch vụ PostgreSQL để áp dụng các thông số mới
sudo systemctl restart postgresql

Để đánh giá hiệu quả sau khi tinh chỉnh, bạn có thể sử dụng công cụ tích hợp sẵn EXPLAIN ANALYZE trước và sau khi đổi cấu hình đối với các câu lệnh SQL chậm. Chỉ số thời gian thực thi (Execution time) giảm đi chính là minh chứng rõ ràng nhất cho thấy hệ thống của bạn đã được tối ưu thành công.

---

Kết luận

Việc tối ưu hóa PostgreSQL trên VPS thông qua file postgresql.conf không phải là một công việc diễn ra một lần duy nhất mà là một quy trình cải tiến liên tục dựa trên sự phát triển của ứng dụng. Bằng cách điều chỉnh hợp lý 5 thông số cấu hình cốt lõi bao gồm: shared_buffers, effective_cache_size, work_mem, maintenance_work_mem và nhóm xử lý song song, cơ sở dữ liệu của bạn chắc chắn sẽ hoạt động mượt mà hơn, tốc độ truy vấn nhanh hơn và mang lại trải nghiệm người dùng tối ưu cho doanh nghiệp.

Tối ưu hóa cơ sở dữ liệu PostgreSQL trên VPS: Top 5 cấu hình cần sửa trong file postgresql.conf để tăng tốc truy vấn | DPTCloud