Cách giảm RAM sử dụng trên VPS Linux hiệu quả

SSH vào VPS Linux, gõ free -h và thấy RAM đã dùng gần hết dù chưa làm gì nặng. Đây là tình huống quen thuộc với ai đang chạy website hoặc ứng dụng trên VPS Linux cấu hình thấp. Bài viết này sẽ hướng dẫn bạn cách giảm RAM sử dụng trên VPS Linux một cách có hệ thống: từ kiểm tra ban đầu, tối ưu từng dịch vụ ngốn RAM nhất, đến các kỹ thuật swap và zram. Mọi lệnh đều chạy được trên Ubuntu 24.04 LTS và Debian 12.
- RAM thực sự đang dùng là bao nhiêu: không phải con số trong
free -hở dòng "used", mà phải xem quaavailablevà cache. - MySQL/MariaDB là thủ phạm hàng đầu: chỉnh
innodb_buffer_pool_sizexuống còn 50-60% RAM là giảm ngay hàng trăm MB. - PHP-FPM và Nginx cũng ngốn RAM đáng kể: giới hạn số process con là cách giảm nhanh nhất.
- Swap và zram giúp VPS 2GB RAM chạy mượt hơn rõ rệt: biết cách cấu hình đúng thay vì để mặc định.
Vì sao RAM trên VPS Linux bị đầy dù không chạy ứng dụng gì nặng?
Linux có cơ chế dùng RAM khác hẳn Windows. Hệ điều hành này chủ động dùng RAM trống để làm cache cho đĩa (page cache), nhằm tăng tốc độ đọc ghi. Vì vậy khi bạn chạy free -h và thấy "used" gần bằng tổng RAM, không hẳn là thiếu bộ nhớ. Con số đáng tin cậy nhất nằm ở dòng available, đó là lượng RAM thực sự có thể cấp cho ứng dụng mới mà không cần đẩy dữ liệu ra swap.
Với các dịch vụ web, RAM bị chiếm chủ yếu đến từ vài thủ phạm quen thuộc: MySQL/MariaDB (đặc biệt là InnoDB buffer pool), PHP-FPM (mỗi process con có thể ngốn 100-200MB), và Nginx worker. Trên VPS chỉ có 2GB hoặc 4GB RAM, việc để các dịch vụ này chạy với cấu hình mặc định sẽ nhanh chóng dẫn đến tình trạng thiếu hụt bộ nhớ, thậm chí bị OOM Killer tắt tiến trình.
Bước 1 - Kiểm tra chính xác RAM đang được dùng bởi dịch vụ nào
Trước khi tối ưu, cần biết chính xác dịch vụ nào đang chiếm bao nhiêu RAM. Lệnh free -h chỉ cho thấy tổng quan, còn để xem chi tiết từng tiến trình, dùng lệnh sau:
ps aux --sort=-%mem | head -20
Lệnh này liệt kê 20 tiến trình đang dùng nhiều RAM nhất, sắp xếp từ cao xuống thấp. Bạn sẽ thấy ngay MySQL hay PHP-FPM chiếm bao nhiêu phần trăm. Cột %MEM là tỷ lệ phần trăm trên tổng RAM, còn cột RSS (tính bằng KB) cho biết dung lượng thực tế tiến trình đang giữ.
Một lệnh hữu ích khác để xem tổng RAM đang dùng của hệ thống và cấu hình swap hiện tại:
free -h
swapon --show
Kết quả mong đợi: dòng Mem hiển thị tổng RAM, used, available. Dòng Swap cho biết đã có swap hay chưa. Nếu swapon --show không trả về gì, nghĩa là VPS của bạn chưa có swap, đây là một trong những việc đầu tiên nên làm với VPS RAM thấp.
Bước 2 - Giảm RAM cho MySQL và MariaDB
MySQL và MariaDB thường là dịch vụ ngốn RAM nhiều nhất trên VPS chạy website. Nguyên nhân chính là InnoDB buffer pool, vùng bộ nhớ lưu dữ liệu và index để truy vấn nhanh. Giá trị mặc định thường quá cao so với VPS 2GB hoặc 4GB RAM. Nếu VPS của bạn dùng MariaDB, hãy tham khảo bài tối ưu MariaDB trên VPS 2GB RAM hiệu quả để có hướng dẫn chi tiết hơn. Còn đây là cách làm nhanh cho cả MySQL lẫn MariaDB.
Mở file cấu hình, trên Ubuntu và Debian thường nằm tại /etc/mysql/mariadb.conf.d/50-server.cnf hoặc /etc/mysql/my.cnf:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Trong phần [mysqld], thêm hoặc chỉnh các dòng sau. Với VPS 2GB RAM, đây là bộ thông số hợp lý:
[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
key_buffer_size = 32M
max_connections = 50
performance_schema = OFF
Giải thích từng giá trị để bạn tự điều chỉnh theo RAM của mình:
innodb_buffer_pool_size: nên đặt khoảng 50-60% RAM khả dụng, hiếm khi vượt quá 70% nếu máy có các dịch vụ khác. Với 2GB RAM, 512M là an toàn.innodb_flush_log_at_trx_commit = 2: giảm tần suất ghi log, giảm tải I/O, chấp nhận rủi ro mất dữ liệu vài giây nếu mất điện đột ngột.performance_schema = OFF: tắt bộ thu thập dữ liệu hiệu năng, tiết kiệm 200-300MB RAM, phù hợp VPS nhỏ.
Sau khi sửa, khởi động lại dịch vụ và kiểm tra lại RAM:
sudo systemctl restart mariadb
sudo systemctl status mariadb
free -h
Nếu mọi thứ hoạt động, MySQL đang chạy và RAM đã giảm đáng kể. Lưu ý nếu bạn đang chạy WordPress, hãy xem thêm bài tối ưu MySQL cho VPS ít RAM hiệu quả để có thêm các chỉ số phù hợp với từng loại website.
Bước 3 - Giảm RAM cho PHP-FPM
PHP-FPM là dịch vụ xử lý mã PHP, mỗi process con (worker) có thể chiếm từ 100MB đến 200MB RAM. Mặc định, PHP-FPM cấu hình số process khá cao, đủ để làm đầy RAM của VPS nhỏ. Cần giới hạn lại theo công thức: với VPS 2GB RAM và website trung bình, 6-8 process là đủ.
File cấu hình chính nằm tại /etc/php/8.3/fpm/pool.d/www.conf (số phiên bản có thể khác). Tìm và sửa các dòng sau:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 8
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500
Ý nghĩa của các thông số này:
pm.max_children = 8: số process PHP tối đa, quyết định tổng RAM tối đa (8 x ~150MB = khoảng 1.2GB). Đây là con số quan trọng nhất.pm.start_servers: số process khởi động ban đầu, để vừa đủ xử lý request mà không lãng phí RAM.pm.max_requests = 500: sau 500 request, process sẽ được khởi động lại, giúp giải phóng RAM bị rò rỉ.
Sau khi sửa, khởi động lại PHP-FPM và kiểm tra:
sudo systemctl restart php8.3-fpm
free -h
RAM sẽ giảm xuống ngay. Nếu bạn chạy WordPress, đừng bỏ qua bài tối ưu PHP-FPM cho WordPress trên VPS Ubuntu để có thêm mẹo chuyên sâu cho nền tảng này.
Bước 4 - Giảm RAM cho Nginx và các dịch vụ nền
Nginx thường không ngốn RAM nhiều như MySQL hay PHP-FPM, nhưng mỗi worker process cũng chiếm vài chục MB. Cấu hình mặc định có thể tạo quá nhiều worker. Sửa file /etc/nginx/nginx.conf:
sudo nano /etc/nginx/nginx.conf
Trong phần events và http, điều chỉnh:
worker_processes auto;
worker_rlimit_nofile 4096;
events {
worker_connections 1024;
}
http {
access_log off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml application/json application/javascript text/javascript;
}
Tắt access_log giúp giảm I/O và bộ nhớ đệm, còn giới hạn worker_connections ngăn việc mở quá nhiều kết nối. Kiểm tra lại cấu hình và restart:
sudo nginx -t
sudo systemctl restart nginx
Ngoài ra, hãy rà soát các dịch vụ không cần thiết đang chạy nền. Lệnh sau liệt kê tất cả service đang active:
systemctl list-units --type=service --state=running
Các dịch vụ thường có thể tắt trên VPS web để giảm RAM: cups (máy in), bluetooth, ModemManager (3G/4G), postfix nếu không dùng để gửi mail. Tắt và vô hiệu hóa lâu dài bằng lệnh:
sudo systemctl stop postfix
sudo systemctl disable postfix
Nếu bạn vẫn cần gửi mail từ VPS, tham khảo bài gửi email transactional trên VPS với Postfix relay để cấu hình nhẹ hơn.
Bước 5 - Cấu hình swap và zram cho VPS 2GB, 4GB RAM
Swap là vùng trên đĩa được dùng làm RAM ảo khi bộ nhớ vật lý cạn. Zram thì nén dữ liệu trong RAM trước khi đẩy ra, hiệu quả hơn với VPS dùng NVMe. Kiểm tra xem VPS đã có swap chưa bằng lệnh swapon --show. Nếu chưa, tạo file swap 2GB (gấp đôi RAM vật lý cho VPS 2GB):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Để swap tự động kích hoạt sau khi khởi động lại, thêm vào file /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Cùng lúc đó, nên điều chỉnh tham số vm.swappiness để hệ thống dùng swap hợp lý hơn. Giá trị mặc định là 60, khá cao. Trên VPS dùng NVMe, có thể giảm xuống 10 để ưu tiên dùng RAM thật trước, tránh swap quá sớm:
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
Zram cũng là lựa chọn đáng cân nhắc. Cài đặt trên Ubuntu 24.04:
sudo apt install zram-tools -y
sudo nano /etc/default/zramswap
Cấu hình zram với dung lượng bằng 50% RAM và thuật toán nén zstd:
ALGO=zstd
PERCENT=50
Khởi động lại dịch vụ zram:
sudo systemctl restart zramswap
swapon --show
Bạn sẽ thấy cả swap file và zram đều xuất hiện. Zram nén dữ liệu trong RAM, trong khi swap file dùng đĩa, kết hợp cả hai giúp VPS 2GB RAM xử lý peak tốt hơn hẳn. Nếu VPS của bạn vẫn thiếu RAM sau tất cả các bước trên, có thể đã đến lúc cân nhắc thuê VPS Linux cấu hình cao hơn với NVMe và IPv4 Việt Nam.
Cách xử lý lỗi thường gặp khi tối ưu RAM
VPS bị OOM Killer tắt tiến trình: Nếu thấy MySQL hoặc PHP-FPM bị "killed" trong log, nghĩa là thiếu RAM trầm trọng. Kiểm tra log bằng lệnh sudo dmesg | grep -i oom hoặc sudo journalctl -xe | grep -i oom. Cách xử lý: giảm tiếp innodb_buffer_pool_size xuống 256M, giảm pm.max_children xuống còn 4, và tăng swap lên 4GB.
Website chậm sau khi tối ưu: Việc giảm RAM có thể khiến MySQL cache ít dữ liệu hơn, làm truy vấn chậm hơn một chút. Kiểm tra bằng lệnh mysqladmin status và xem chỉ số Queries per second avg. Nếu giảm mạnh, hãy nâng innodb_buffer_pool_size lên mức vừa phải và bật Redis cache cho ứng dụng. Bạn có thể tham khảo bài cách cài Redis trên VPS Linux chi tiết 2026 để cài đặt.
Swapfile bị lỗi khi khởi động: Lỗi này thường do dòng khai báo trong /etc/fstab sai. Kiểm tra bằng lệnh sudo blkid và sửa lại UUID nếu cần. Nếu không dùng được swapfile, có thể xóa và tạo lại từ đầu bằng lệnh sudo rm /swapfile và làm lại các bước tạo swap ở trên.
Câu hỏi thường gặp về giảm RAM trên VPS Linux
Vì sao lệnh free -h cho thấy RAM used gần đầy dù tôi không chạy gì?
Đó là do Linux dùng RAM trống làm cache đĩa (page cache) để tăng tốc độ đọc ghi. Con số "used" trong free -h bao gồm cả cache này. Bạn nên quan sát cột available, đây là lượng RAM thực sự có thể dùng cho ứng dụng. Để xem chi tiết, chạy cat /proc/meminfo hoặc htop.
Có nên tắt hẳn MySQL để giảm RAM không?
Không, MySQL là dịch vụ cần thiết nếu bạn chạy website. Thay vì tắt, hãy tối ưu cấu hình để nó dùng ít RAM hơn. Giảm innodb_buffer_pool_size xuống còn 50-60% RAM là cách hiệu quả nhất. Nếu không dùng MySQL, có thể gỡ cài đặt hẳn bằng lệnh sudo apt remove mysql-server mariadb-server.
Zram có thay thế hoàn toàn swap file được không?
Không nên. Zram nén dữ liệu trong RAM, nhưng thuật toán nén cũng cần một phần bộ nhớ. Khi RAM gần cạn, zram không còn chỗ để nén thêm. Swap file dùng đĩa, tuy chậm hơn nhưng có dung lượng lớn hơn. Kết hợp cả hai là lựa chọn tối ưu, như hướng dẫn trong bài viết.
Tối ưu RAM xong, website chạy chậm hơn thì phải làm sao?
Kiểm tra mức độ sử dụng CPU và thời gian phản hồi của từng dịch vụ. Nếu MySQL phản hồi chậm, hãy nâng innodb_buffer_pool_size lên một chút, đồng thời bật Redis để cache các truy vấn thường xuyên. Nếu PHP-FPM thiếu process, tăng pm.max_children lên nhưng phải tính toán cho khớp với RAM. Sự cân bằng giữa RAM và hiệu năng là một quá trình điều chỉnh liên tục.
Bài viết liên quan
- Cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp
- Tối ưu MariaDB trên VPS 2GB RAM hiệu quả
- Tối ưu MySQL cho VPS ít RAM hiệu quả


