Cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp

Bạn vừa thuê một VPS 1GB hay 2GB RAM để chạy Docker, web server và database? Chưa đầy 30 phút sau khi cài MariaDB và vài container, bạn đã thấy hệ thống ì ạch, dmesg báo Out of memory và tiến trình bị oom-killer tóm gọn. Vấn đề không nằm ở nhà cung cấp, mà ở việc bạn chưa cấu hình swap đúng cách và chưa tối ưu các service.
Bài viết này dành cho sysadmin đang dùng VPS RAM thấp (1-4GB) chạy Ubuntu 24.04. Mình sẽ hướng dẫn tạo swap file, tinh chỉnh các tham số kernel và tunning các service ngốn RAM nhất để VPS của bạn chạy ổn định, tránh bị kill process giữa chừng. Các lệnh đều có thể copy-paste và chạy ngay trên VPS.
- Swap file nên đặt gấp 1-2 lần RAM, nhưng không quá 8GB.
- Giá trị
vm.swappiness=10giúp kernel chỉ dùng swap khi RAM thật sự cạn. - Tunning MariaDB (InnoDB buffer pool ~50-60% RAM) và PHP-FPM (pm.max_children ~5-10) giúp tiết kiệm hàng trăm MB RAM.
- Kiểm tra swap usage bằng
swapon --showvàfree -hsau mỗi bước.
Yêu cầu trước khi bắt đầu
- VPS chạy Ubuntu 24.04 LTS hoặc Debian 12 (các bước tương tự).
- Quyền
roothoặc sudo non-root. - RAM thấp: 1GB, 2GB, hoặc 4GB.
- Ít nhất 5-10GB dung lượng ổ NVMe trống (swap sẽ chiếm 1-8GB tuỳ cấu hình).
Vì sao VPS RAM thấp cần swap và tối ưu?
Swap là vùng trên ổ cứng (NVMe hoặc SSD) được kernel dùng làm bộ nhớ phụ. Khi RAM đầy, kernel chuyển các trang nhớ ít dùng lên swap, giúp các tiến trình đang hoạt động có thêm không gian. VPS RAM thấp mà không có swap, hoặc có swap nhưng đặt sai tham số, dễ dẫn đến tình trạng OOM (Out Of Memory) và kernel giết process ngẫu nhiên.
Swap không thể thay thế RAM, nó chậm hơn hàng trăm lần. Nhưng với VPS RAM thấp, swap là "phao cứu sinh" khi workload tăng đột biến, như có 200 request cùng lúc vào WordPress hay Docker build image. Swap + tunning service cho phép VPS 1-2GB chạy Docker, MariaDB, Nginx cùng lúc mà không bị sập.
Bước 1 - Kiểm tra swap hiện tại và dung lượng ổ
Trước khi tạo, kiểm tra xem VPS đã có swap chưa và ổ còn bao nhiêu dung lượng trống.
swapon --show
free -h
df -h /
Lệnh đầu tiên hiển thị swap đang active (nếu có). Lệnh thứ hai cho biết total RAM, used, free và swap usage. Lệnh df -h / kiểm tra dung lượng trống trên phân vùng gốc, cần ít nhất gấp 1.5 lần swap file dự định.
Nếu swapon --show không trả về gì, VPS chưa có swap.
Bước 2 - Tạo swap file
Với VPS RAM 1GB, tạo swap 2GB. VPS 2GB, tạo swap 4GB. VPS 4GB, tạo swap 2-4GB (tùy workload). Không nên tạo swap quá 8GB vì hiệu suất giảm mạnh.
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
fallocate tạo file nhanh hơn dd vì không ghi zero. chmod 600 bảo vệ file khỏi người dùng khác. mkswap định dạng file thành swap. swapon kích hoạt ngay.
Verify:
swapon --show
free -h
Output mong đợi: /swapfile với size 2.0G, và dòng "Swap" trong free -h hiển thị total = 2.0G.
Lưu ý: Nếu dùng hệ thống có ZFS (ví dụ Proxmox trên máy chủ riêng), không dùng fallocate vì nó tạo sparse file trên ZFS, gây lỗi. Thay bằng dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress.
Bước 3 - Cấu hình swap tự động bật sau reboot
Thêm dòng vào /etc/fstab để swap được kích hoạt tự động mỗi lần khởi động:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Verify:
cat /etc/fstab | grep swap
Output phải chứa dòng /swapfile none swap sw 0 0.
Bước 4 - Tinh chỉnh tham số kernel (swappiness và cache pressure)
Giảm swappiness xuống 10
vm.swappiness kiểm soát xu hướng kernel đẩy trang nhớ ra swap. Mặc định là 60, rất cao, nghĩa là kernel sẽ dùng swap sớm dù RAM còn trống. Với VPS RAM thấp, nên đặt về 10-20 để ưu tiên giữ dữ liệu trong RAM lâu hơn.
sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
Giảm vfs_cache_pressure
vfs_cache_pressure kiểm soát tốc độ kernel thu hồi bộ nhớ của dentry và inode cache. Giá trị thấp hơn giúp lưu cache lâu hơn, giảm I/O.
sysctl vm.vfs_cache_pressure=50
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
Verify sau reboot: Kiểm tra giá trị đã được ghi nhớ:
sysctl vm.swappiness vm.vfs_cache_pressure
Output: vm.swappiness = 10 và vm.vfs_cache_pressure = 50.
Bước 5 - Tối ưu các service ngốn RAM
MariaDB/MySQL (InnoDB buffer pool)
InnoDB buffer pool thường là thủ phạm lớn nhất. Với VPS 1-2GB RAM, đặt buffer pool từ 50-60% RAM. Nếu để mặc định 128MB, MariaDB không dùng hết RAM nhưng cũng không cache được gì; nếu để 80% dễ gây OOM.
Sửa file /etc/mysql/mariadb.conf.d/50-server.cnf (hoặc /etc/my.cnf.d/mariadb-server.cnf trên AlmaLinux):
[mysqld]
innodb_buffer_pool_size = 512M # 512MB nếu RAM 1GB, 1G nếu 2GB
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2 # tăng tốc ghi log, giảm I/O
max_connections = 50 # giảm từ mặc định 151
Cẩn thận: VPS 1GB đừng đặt buffer pool quá 600MB. Kiểm tra lượng RAM MariaDB dùng bằng:
ps aux | grep mysql
systemctl restart mariadb
systemctl status mariadb
PHP-FPM
Mỗi process PHP-FPM tiêu tốn 30-60MB (tuỳ ứng dụng). Với VPS 1GB, set pm.max_children thấp:
Sửa /etc/php/8.3/fpm/pool.d/www.conf:
pm = dynamic
pm.max_children = 10 # max 10 process concurrent
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
Với VPS 2GB, tăng lên pm.max_children = 20.
systemctl restart php8.3-fpm
Nginx, worker processes
worker_processes auto sẽ tự động dùng số core CPU. Với VPS 1-2 vCPU, đặt fixed thay auto để tránh sinh quá nhiều worker không cần thiết:
worker_processes 2; # thay auto bằng số vCPU thực
events {
worker_connections 1024;
}
Sau đó test config và restart:
nginx -t && systemctl restart nginx
Bước 6 - Giám sát swap và RAM daily
Nên thiết lập giám sát cơ bản để không bất ngờ vì swap đầy. Dùng lệnh đơn giản hoặc cài một cron job ghi log:
free -h | awk 'NR==2{printf "RAM: %s/%s\n", $3,$2}' && free -h | awk 'NR==3{printf "Swap: %s/%s\n", $3,$2}'
Thêm vào cron mỗi giờ để ghi log:
0 * * * * free -h >> /var/log/ram_swap.log
Kiểm tra log sau vài ngày để xem xu hướng dùng swap. Nếu swap luôn >80%, cần tăng RAM hoặc tối ưu thêm service.
Xử lý lỗi thường gặp
Lỗi "swapon: /swapfile: swapon failed: Invalid argument"
Do file swap bị lỗi hoặc hệ thống file không hỗ trợ swap. Giải pháp: xoá swap cũ, tạo lại bằng dd thay fallocate.
swapoff /swapfile
rm /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
mkswap /swapfile
swapon /swapfile
VPS báo "kernel: OOM-killer: gfp_mask=..." dù đã có swap
Swap không kịp mở rộng hoặc swappiness quá cao. Kiểm tra vm.swappiness, nếu đang 60, hạ xuống 10. Kiểm tra swap usage: nếu swap đã dùng >80%, cần tăng swap file hoặc tối ưu service.
MariaDB không khởi động sau khi chỉnh buffer pool
Do innodb_buffer_pool_size đặt quá lớn so với RAM. Kiểm tra log lỗi:
journalctl -u mariadb --no-pager | tail -30
Nếu thấy lỗi "Cannot allocate memory", giảm buffer pool size xuống còn 256M hoặc 128M, restart lại.
Câu hỏi thường gặp
Có nên dùng swap trên VPS NVMe không?
Có. NVMe có tốc độ đọc ghi rất cao (hàng ngàn MB/s), nhanh hơn nhiều so với HDD hay SATA SSD. Swap trên NVMe ít ảnh hưởng đến hiệu năng tổng thể hơn, nhưng vẫn không thể thay RAM. Bạn chỉ nên dùng swap như "cứu cánh", không phải giải pháp lâu dài.
Swappiness = 10 có làm chậm VPS không?
Không. Swappiness = 10 có nghĩa kernel chỉ dùng swap khi RAM thực sự đầy trên 90%. Điều này tốt cho VPS RAM thấp vì kernel không đẩy trang nhớ ra swap một cách vô ích. Nếu bạn có VPS RAM cao (8GB+), có thể giữ mặc định 60 hoặc hạ xuống 10-20 tuỳ workload.
Làm sao biết VPS đang bị thiếu RAM?
Dấu hiệu: free -h thấy Swap used > 0 thường xuyên, dmesg | grep oom có log OOM-killer, website hoặc app bị kill đột ngột, response time tăng vọt. Nếu swap dùng >80% liên tục, bạn cần tài nguyên thực hơn, có thể nâng cấp lên thuê VPS giá rẻ với RAM lớn hơn.
Swap trên file hay swap trên partition, cái nào hơn?
Hiệu năng tương đương. Swap file dễ thay đổi kích thước, không cần repartition ổ. Swap partition nhanh hơn một chút khi đọc ghi vì không qua filesystem layer. Nhưng với VPS trên nền ảo hoá KVM, khác biệt không đáng kể. Mình khuyên dùng swap file vì linh hoạt.
Tôi có 2GB RAM, cần swap bao nhiêu là đủ?
Thông thường 2-4GB swap là vừa. Nếu bạn chạy Docker vài container, database nhỏ, 2GB swap là đủ. Nếu build code hoặc chạy nhiều service, 4GB. Không nên quá 8GB vì swap quá lớn gây lãng phí ổ NVMe và hiệu năng không tăng thêm.
Nên đặt vm.swappiness bao nhiêu cho VPS Docker?
Với VPS chạy Docker (container, không database nặng), đặt swappiness = 10-20. Docker container thường chạy nhiều tiến trình nhỏ, swap ít hiệu quả. Nếu thấy swap dùng quá nhiều, kiểm tra docker stats và tối ưu Dockerfile (đa stage build, giảm image size).
Bài viết liên quan
- Tối ưu MariaDB cho VPS RAM thấp trên Ubuntu 24.04
- Tối ưu Nginx cho traffic cao: worker, gzip, buffer, cache
- Tối ưu PHP-FPM cho WordPress trên VPS
- Tối ưu Linux và NVMe cho workload I/O cao trên VPS


