Vấn đề: Vì sao VPS 1GB – 2GB RAM hay sập dịch vụ?
Chạy WordPress, bot Telegram hoặc vài container Docker trên VPS 1GB – 2GB RAM rất dễ gặp sự cố. Đang hoạt động bình thường, server bỗng mất kết nối SSH. Nginx trả về lỗi 502 Bad Gateway, còn tiến trình MySQL thì biến mất không dấu vết.
Nguyên nhân phần lớn đến từ OOM (Out Of Memory) Killer của nhân Linux. Khi RAM vật lý cạn kiệt, OOM Killer sẽ can thiệp để bảo vệ hệ điều hành. Nó tự động ‘bắn hạ’ tiến trình chiếm nhiều bộ nhớ nhất — thường chính là cơ sở dữ liệu MySQL hoặc PostgreSQL.
Nhiều nhà cung cấp Cloud/VPS (như DigitalOcean, Hetzner hay Linode) mặc định không tạo sẵn phân vùng Swap để giảm tải I/O lên cụm lưu trữ chung. Hậu quả là khi tải tăng đột biến, hệ thống không còn vùng đệm và sập ngay lập tức. Thay vì vội nâng cấp gói VPS tốn thêm vài USD mỗi tháng, bạn có thể triển khai mô hình bộ nhớ hai tầng: zRAM nén trong bộ nhớ và Swap file trên ổ cứng.
Bản chất kỹ thuật: So sánh Swap ổ đĩa và zRAM
Hiểu rõ cách hoạt động của hai cơ chế này sẽ giúp bạn cấu hình thông số chuẩn xác thay vì copy-paste máy móc.
1. Swap truyền thống (Disk Swap)
Swap trên ổ đĩa là một file hoặc phân vùng nằm trên SSD/NVMe. Khi RAM đầy, kernel chuyển các trang bộ nhớ không hoạt động (inactive pages) xuống ổ đĩa để nhường chỗ cho ứng dụng đang chạy.
- Điểm mạnh: Dung lượng linh hoạt, chi phí rẻ, cứu server khỏi tình trạng crash khi tải đỉnh điểm.
- Hạn chế: Băng thông SSD NVMe phổ thông đạt khoảng 1.500 – 3.500 MB/s, vẫn chậm hơn rất nhiều so với băng thông RAM (thường trên 20.000 MB/s). Khi RAM cạn kiệt liên tục, hiện tượng swap thrashing sẽ xuất hiện: chỉ số
iowaitvọt lên 70% – 90%, CPU nghẽn cục bộ và phản hồi web bị timeout.
2. zRAM (Bộ nhớ nén thời gian thực)
zRAM tạo ra một block device ảo nằm ngay trên RAM vật lý. Dữ liệu khi chuyển vào đây được nén lại theo thời gian thực bằng các thuật toán tốc độ cao như ZSTD hoặc LZ4.
Lấy ví dụ: VPS của bạn cần chứa 1GB dữ liệu tạm. Thay vì đẩy 1GB đó xuống SSD, kernel nén dữ liệu qua zRAM chỉ còn khoảng 350MB – 400MB (tỷ lệ nén ~2.5:1) và giữ nguyên trong RAM. Bạn đổi khoảng 2% – 5% chu kỳ CPU để tăng gần gấp đôi dung lượng bộ nhớ khả dụng.
- Điểm mạnh: Tốc độ truy xuất nhanh ngang RAM thật. Giảm thiểu số lần ghi vào SSD, giúp duy trì tuổi thọ ổ đĩa.
- Hạn chế: Vẫn tiêu tốn một phần dung lượng RAM thực và yêu cầu năng lực xử lý từ CPU khi nén/giải nén.
Mô hình phân tầng theo độ ưu tiên (Priority)
Hệ điều hành Linux hỗ trợ cơ chế gán trọng số ưu tiên cho từng thiết bị Swap thông qua cờ pri:
- Tầng 1 (Priority 100 – zRAM): Hệ thống đẩy dữ liệu nhàn rỗi vào vùng nén zRAM trước tiên để duy trì tốc độ xử lý tức thì.
- Tầng 2 (Priority -2 – Disk Swap): Chỉ khi RAM vật lý và zRAM đều đầy, dữ liệu mới tràn xuống Swap file trên SSD để tránh việc OOM Killer kích hoạt.
Quy trình thiết lập trên Ubuntu Server
Các bước sau thực hiện trên Ubuntu Server (hỗ trợ các phiên bản 20.04, 22.04 và 24.04 LTS) bằng tài khoản có quyền sudo.
Bước 1: Rà soát trạng thái bộ nhớ
Kiểm tra cấu hình bộ nhớ hiện tại của hệ thống:
free -h
swapon --show
Nếu dòng Swap báo dung lượng 0B và lệnh swapon --show không in ra kết quả, máy chủ của bạn chưa có bất kỳ bộ nhớ đệm nào.
Bước 2: Tạo Swap File dự phòng trên SSD
Với máy chủ có 1GB đến 2GB RAM, một file Swap dung lượng 2GB là kích thước hợp lý để làm tầng cứu hộ.
Khởi tạo file và gán quyền bảo mật bắt buộc:
# Tạo file 2GB nhanh bằng fallocate
sudo fallocate -l 2G /swapfile
# Khóa quyền: chỉ root mới được phép đọc/ghi dữ liệu này
sudo chmod 600 /swapfile
# Định dạng swap
sudo mkswap /swapfile
# Kích hoạt ngay vào hệ thống
sudo swapon /swapfile
Ghi cấu hình vào /etc/fstab để Swap file tự nhận diện mỗi lần server reboot:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Bước 3: Cài đặt và cấu hình zRAM
Cài đặt gói quản lý zram-tools từ kho phần mềm chính thức của Ubuntu:
sudo apt update
sudo apt install -y zram-tools
Mở file cấu hình dịch vụ:
sudo nano /etc/default/zramswap
Điều chỉnh các thông số chính xác như sau (xóa bỏ ký tự # ở đầu dòng nếu có):
# Thuật toán: zstd cho tỷ lệ nén tốt và tốc độ tối ưu trên CPU hiện đại
ALGO=zstd
# Giới hạn kích thước zRAM bằng 50% tổng RAM vật lý
PERCENT=50
# Đặt mức ưu tiên cao hơn swap ổ cứng
PRIORITY=100
Lưu file (Ctrl + O, nhấn Enter rồi Ctrl + X). Sau đó khởi động lại dịch vụ zRAM:
sudo systemctl restart zramswap
Bước 4: Điều chỉnh Kernel parameters bằng sysctl
Mặc định Linux chỉ bắt đầu đẩy dữ liệu sang swap khi RAM đã gần cạn. Khi có zRAM, ta muốn kernel tích cực nén dữ liệu nhàn rỗi từ sớm để RAM luôn trống cho các tiến trình xử lý nặng.
Tạo file tinh chỉnh sysctl riêng biệt:
sudo nano /etc/sysctl.d/99-memory-tuning.conf
Dán nội dung cấu hình sau:
# Tích cực nén trang nhớ ít dùng vào zRAM sớm
vm.swappiness=100
# Giảm áp lực giải phóng cache dentry/inode, giữ file cache trên RAM lâu hơn
vm.vfs_cache_pressure=50
# Ép flush dữ liệu bẩn xuống đĩa sớm để tránh dồn ứ I/O
vm.dirty_background_ratio=5
vm.dirty_ratio=10
Áp dụng ngay các giá trị mới mà không cần khởi động lại máy:
sudo sysctl --system
Bước 5: Xác minh kết quả hoạt động
Chạy lệnh kiểm tra danh sách swap đang hoạt động:
swapon --show
Đầu ra thực tế trên VPS 1GB RAM sẽ có dạng như sau:
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 485M 0B 100
/swapfile file 2G 0B -2
Cột PRIO xác nhận kiến trúc phân tầng đã hoạt động: /dev/zram0 mang mức ưu tiên 100, cao hơn hẳn mức -2 của /swapfile. Linux sẽ ghi toàn bộ vào zRAM trước. Ổ cứng chỉ can thiệp khi phân vùng zRAM 485MB này đạt ngưỡng giới hạn.
Sau vài giờ chạy thực tế, bạn có thể kiểm tra hiệu suất nén qua lệnh:
zramctl
Bảng số liệu chi tiết sẽ hiển thị:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 485M 180M 65M 72M 1 [SWAP]
Ở ví dụ trên, 180MB dữ liệu (DATA) sau khi nén chỉ còn chiếm 65MB RAM thật (COMPR). Tỷ lệ nén đạt gần 2.8 lần.
Tổng kết
Với vài phút cấu hình, bạn đã tạo ra cơ chế đệm an toàn cho server: zRAM chịu trách nhiệm về tốc độ, còn Swap file chịu trách nhiệm chống tràn bộ nhớ. Đây là bước chuẩn hóa thiết yếu cho mọi máy chủ Linux cấu hình thấp, giúp hệ thống hoạt động ổn định và loại bỏ tình trạng rớt dịch vụ do lỗi thiếu RAM.
