Skip to content
VDS · Cơ sở dữ liệu

Cấu hình bộ nhớ cơ sở dữ liệu cho tier của bạn

Giá trị buffer cụ thể cho PostgreSQL và MySQL cho VDS-1…VDS-6, và quy tắc phân phối bộ nhớ giữa cơ sở dữ liệu, ứng dụng, và hệ thống.

Cập nhật 23 tháng 8, 2026

Cấu hình cơ sở dữ liệu mặc định được thiết kế để chạy được ở mọi nơi, chứ không phải để chạy nhanh. Trên VDS-3 với 8 GB bộ nhớ, PostgreSQL khi cài mặc định chỉ dùng 128 MB cho cache — nghĩa là nó đọc gần như mọi thứ từ đĩa, dù hoàn toàn có thể đọc từ bộ nhớ.

Quy tắc phân bổ

Chia bộ nhớ của gói đại khái như sau:

  • hệ thống và các tiến trình dịch vụ — 10–15%;
  • ứng dụng (PHP-FPM, Node, gunicorn) — theo số lượng worker;
  • cơ sở dữ liệu — phần còn lại, nhưng không quá 60–70% tổng bộ nhớ.

Đừng bao giờ cấp hết bộ nhớ cho cơ sở dữ liệu: hệ thống sẽ rơi vào swap, và NVMe cũng không cứu được bạn — độ trễ sẽ tăng lên hàng chục lần.

Lượng đang sử dụng hiện tại:

free -h
ps -eo pmem,rss,comm --sort=-rss | head

Biểu đồ bộ nhớ trong một giờ, một ngày, một tuần và một tháng có trong mục "Tổng quan" của bảng điều khiển /hosting/vds/m/<id> — chúng hiển thị đỉnh thực tế, chứ không phải thời điểm hiện tại.

PostgreSQL

/etc/postgresql/17/main/postgresql.conf:

Góishared_bufferseffective_cache_sizework_memmaintenance_work_memmax_connections
VDS-1 (2 GB)384MB1GB8MB96MB40
VDS-2 (4 GB)1GB2GB12MB256MB60
VDS-3 (8 GB)2GB5GB16MB512MB100
VDS-4 (16 GB)4GB10GB24MB1GB150
VDS-5 (24 GB)6GB16GB32MB2GB200
VDS-6 (32 GB)8GB22GB48MB2GB250

Thêm các thiết lập chung cho NVMe:

random_page_cost = 1.1
effective_io_concurrency = 200

work_mem được cấp cho mỗi thao tác sắp xếp, chứ không phải mỗi kết nối: một trăm truy vấn song song có sắp xếp phức tạp sẽ nhân nó lên hàng trăm lần. Đừng đặt quá cao.

Áp dụng: systemctl restart postgresql (thay đổi shared_buffers bắt buộc phải khởi động lại).

MySQL và MariaDB

Góiinnodb_buffer_pool_sizeinnodb_log_file_sizemax_connections
VDS-1512M128M60
VDS-21G256M100
VDS-33G512M150
VDS-48G1G200
VDS-512G1G250
VDS-618G2G300
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000

Buffer pool là tham số chính: nếu nó chứa được tập dữ liệu đang làm việc, đĩa gần như không bị đọc.

Kiểm tra hiệu quả

SELECT sum(blks_hit)*100/sum(blks_hit+blks_read) FROM pg_stat_database;

Với MySQL, hãy xem SHOW ENGINE INNODB STATUS và tỷ lệ giữa Innodb_buffer_pool_reads và Innodb_buffer_pool_read_requests. Tỷ lệ cache hit dưới 95% nghĩa là cơ sở dữ liệu không đủ bộ nhớ.

Lỗi thường gặp

Triệu chứngNguyên nhân
Cơ sở dữ liệu không khởi động sau khi sửaYêu cầu nhiều bộ nhớ hơn mức có sẵn — kiểm tra journal
Tiến trình bị OOM killCơ sở dữ liệu, ứng dụng và hệ thống cộng lại vượt quá bộ nhớ của gói
Chậm hơn sau khi "tối ưu"work_mem đặt quá cao, máy đang swap
Đĩa liên tục bị đọcBuffer quá nhỏ, tập dữ liệu làm việc không vừa

Nếu sau khi tinh chỉnh bộ nhớ bạn vẫn chạm trần, thì vấn đề nằm ở lượng dữ liệu chứ không phải cấu hình. Bạn chỉ có thể nâng cấp gói, với khoản thanh toán được tính theo tỷ lệ cho những ngày còn lại của kỳ hạn đã trả; không hỗ trợ hạ cấp, nên hãy cân nhắc kỹ khi chọn gói tiếp theo.