Hướng dẫn sử dụng ZRAM trên Linux: Tối ưu RAM và tăng tốc hệ thống với Swap nén

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

2 giờ sáng, điện thoại rung bần bật vì chuông PagerDuty: cụm node chạy PostgreSQL và Redis báo động đỏ. Load average vọt từ 1.8 lên tận 28.5, API trả về timeout 504 liên tục. SSH vào gõ vội dmesg -T, đập ngay vào mắt là vết tích quen thuộc: Out of Memory (OOM) Killer vừa thẳng tay kết liễu worker process. Dung lượng RAM 8GB sạch bách. Disk I/O chạm trần 100% với %iowait vọt lên 85%, bởi kernel đang chật vật đẩy từng trang nhớ qua lại trên swapfile ở ổ cứng.

Ba hướng giải cứu bộ nhớ trên Linux

Khi máy chủ cạn RAM, chúng ta thường đứng giữa 3 lựa chọn kỹ thuật:

1. Mở rộng Swap file hoặc Swap partition trên ổ cứng

Đây là giải pháp kinh điển nhất. Bạn cắt một file 4GB–8GB trên ổ cứng bằng fallocate, format swap rồi bật lên bằng swapon:

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

2. Zswap (Compressed Cache cho Swap)

Zswap đóng vai trò tầng đệm giữa RAM và ổ cứng. Khi kernel muốn swap một trang nhớ, zswap sẽ nén trang đó lại rồi giữ trong một vùng đệm trên RAM. Chỉ khi vùng đệm này đầy, dữ liệu nén mới bị đẩy xuống swapfile dưới ổ đĩa vật lý.

3. ZRAM (Compressed RAM Block Device)

ZRAM khởi tạo một block device ảo nằm hoàn toàn trên RAM (như /dev/zram0). Mọi dữ liệu ghi vào đây đều được nén tức thì bằng các thuật toán siêu tốc như zstd hoặc lz4. Kernel nhìn nhận nó như một phân vùng swap thông thường, nhưng độ trễ truy xuất chỉ tính bằng microsecond (µs) thay vì millisecond (ms) của ổ cứng.

Đặt lên bàn cân: Ưu và nhược điểm từng phương án

Mỗi giải pháp sinh ra để giải quyết một bài toán riêng:

Swap truyền thống trên Disk

  • Ưu điểm: Thiết lập trong 30 giây. Dung lượng mở rộng thoải mái theo dung lượng đĩa còn trống và không chiếm thêm một megabyte RAM nào.
  • Nhược điểm: Tốc độ đọc ghi chênh lệch hàng nghìn lần so với RAM. Khi RAM cạn kiệt, hệ thống rơi vào thảm họa disk thrashing: I/O nghẽn đứng, CPU kẹt cứng ở trạng thái iowait và server mất khả năng phản hồi. Nếu dùng SSD giá rẻ, việc ghi swap liên tục với cường độ vài chục GB mỗi ngày sẽ bào mòn chỉ số TBW (Total Bytes Written) rất nhanh.

Zswap

  • Ưu điểm: Cắt giảm khoảng 60–80% lượng ghi xuống ổ cứng. Rất thích hợp khi bạn bắt buộc phải có một swapfile dung lượng lớn trên đĩa để làm chốt chặn an toàn cuối cùng.
  • Nhược điểm: Bắt buộc phải có sẵn swapfile hoặc swap partition trên đĩa thì zswap mới hoạt động. Ngoài ra, việc điều phối giải phóng trang nhớ từ RAM xuống disk lúc tải tăng đột ngột có thể gây hiện tượng micro-stuttering.

ZRAM

  • Ưu điểm: Tốc độ gần như tiệm cận RAM vật lý. Tỷ lệ nén thực tế đạt từ 2:1 đến 3.5:1 với dữ liệu text, code, JSON payload hay in-memory cache. Tức là 4GB RAM vật lý có thể gom gọn lượng dữ liệu tương đương 8GB–14GB uncompressed. Toàn bộ thao tác diễn ra trên RAM nên SSD hoàn toàn không bị hao mòn.
  • Nhược điểm: Tiêu tốn thêm 2–5% chu kỳ CPU để nén và giải nén. Nếu server của bạn vốn đã nghẽn CPU ở mức 95–100%, bạn nên ưu tiên thuật toán lz4 thay vì zstd.

Tại sao ZRAM là giải pháp cứu cánh hàng đầu?

Trước đây mình từng quản lý một VPS 2 Core / 4GB RAM chạy cụm Magento 2 và MySQL. Cứ mỗi đợt chạy flash sale lúc nửa đêm, lượng khách truy cập tăng gấp 4 lần khiến RAM bốc hơi trong vài phút. Swapfile 4GB trên ổ SSD NVMe kích hoạt, kéo theo iowait tăng vọt lên 40%, MySQL sập vì OOM Killer.

Sau khi chuyển sang dùng ZRAM 4GB kèm thuật toán zstd, cục diện thay đổi hoàn toàn: cùng đợt spike traffic đó, hệ thống nuốt trọn hơn 2.5GB swap nén vào RAM mà CPU chỉ tăng thêm khoảng 3%. Quan trọng nhất: load average duy trì dưới 2.5, không một tiến trình nào bị giết.

Với VPS cỡ nhỏ (1GB–4GB RAM) hoặc node chạy Docker/K8s chứa nhiều sidecar container, ZRAM là chiếc phao cứu sinh rẻ nhất: nó chặn đứng OOM Killer mà bạn chưa cần nâng cấp gói server ngay lập tức.

Hướng dẫn cấu hình ZRAM chi tiết

Cách 1: Triển khai nhanh qua zram-tools (Ubuntu / Debian)

Trên các bản phân phối họ Debian, gói zram-tools cung cấp sẵn systemd service rất tiện lợi:

sudo apt update
sudo apt install -y zram-tools

Mở file cấu hình:

sudo nano /etc/default/zramswap

Điền các thông số sau:

# Thuật toán nén: zstd (tỷ lệ nén tốt nhất) hoặc lz4 (nhanh nhất, ăn ít CPU)
ALGO=zstd

# Cấp phát 50% tổng dung lượng RAM vật lý cho ZRAM
PERCENT=50

# Đặt priority cao hơn swapfile trên đĩa (thường là -2)
PRIORITY=100

Khởi động service để áp dụng thay đổi:

sudo systemctl restart zramswap
sudo systemctl status zramswap

Cách 2: Cấu hình thủ công bằng module kernel (Mọi distro: CentOS, RHEL, AlmaLinux, Arch)

Nếu server không có sẵn package quản lý, bạn có thể nạp trực tiếp kernel module chỉ với vài dòng lệnh:

# 1. Nạp module zram vào kernel
sudo modprobe zram num_devices=1

# 2. Chọn thuật toán nén zstd cho thiết bị ảo /dev/zram0
echo zstd | sudo tee /sys/block/zram0/comp_algorithm

# 3. Cấp kích thước swap ảo 4GB (uncompressed size)
echo 4G | sudo tee /sys/block/zram0/disksize

# 4. Định dạng block device thành swap
sudo mkswap -U clear /dev/zram0

# 5. Kích hoạt với mức ưu tiên cao (priority 100)
sudo swapon -p 100 /dev/zram0

Kiểm tra và giám sát trạng thái ZRAM

Sau khi bật ZRAM, lệnh zramctl sẽ cho bạn cái nhìn trực quan nhất:

zramctl

Đầu ra thực tế trên terminal:

NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd            4G  1.2G 420.5M 460.8M       4 [SWAP]

Ý nghĩa các cột: DATA là 1.2GB dữ liệu ban đầu, khi nén lại chỉ còn 420.5M. Tính cả overhead quản lý bộ nhớ, ZRAM chỉ chiếm thực tế 460.8M RAM (cột TOTAL) — tức tỷ lệ nén đạt tới ~2.8:1. Tiếp theo, kiểm tra phân bổ swap tổng thể bằng hai lệnh quen thuộc:

swapon --show
free -h

Tinh chỉnh thông số Swappiness trong sysctl

Mặc định Linux chỉ đẩy dữ liệu sang swap khi RAM gần cạn (giá trị mặc định thường là vm.swappiness=60). Tuy nhiên, vì ZRAM nằm ngay trên RAM và truy xuất tính bằng microsecond, chiến lược tối ưu là chủ động swap sớm các trang nhớ ít dùng để giải phóng RAM cho Page Cache:

# Xem giá trị hiện tại
cat /proc/sys/vm/swappiness

# Nâng swappiness lên 100 để kernel chủ động tận dụng ZRAM
sudo sysctl vm.swappiness=100

Để áp dụng vĩnh viễn kể cả sau khi reboot, hãy thêm 2 dòng sau vào cuối file /etc/sysctl.conf:

vm.swappiness=100
vm.page-cluster=0

Tham số vm.page-cluster=0 ra lệnh cho kernel đọc và nén từng trang nhớ đơn lẻ (4KB) thay vì gom cụm $2^3 = 8$ trang (32KB). Tinh chỉnh nhỏ này giúp triệt tiêu độ trễ đọc ghi không cần thiết trên swap nén.

Share: