Quản lý Linux Swap: Tối ưu hóa Swapfile, Swappiness và zSwap cho Máy chủ Tải cao

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

Tại sao máy chủ 64GB RAM của bạn vẫn cần Swap

Vô hiệu hóa Swap vì bạn có 64GB RAM là một kiểu “tối ưu hóa” kinh điển nhưng thường xuyên phản tác dụng. Swap không chỉ là một bể chứa tạm thời khi bạn hết bộ nhớ. Nó là một thành phần cốt lõi trong việc quản lý bộ nhớ của nhân (kernel) Linux. Swap cho phép hệ thống di chuyển các dữ liệu nhàn rỗi—chẳng hạn như một daemon chạy nền không được truy cập trong ba ngày—ra khỏi RAM tốc độ cao và đưa xuống đĩa cứng. Điều này giúp giải phóng không gian cho các tiến trình đang hoạt động và bộ nhớ đệm hệ thống tệp (filesystem cache) quan trọng.

Nếu không có lưới an toàn này, bạn đang chơi trò “cò quay Nga” (Russian Roulette) với Out of Memory (OOM) Killer. Khi RAM chạm ngưỡng 99% dung lượng, nhân Linux sẽ bắt đầu chấm dứt các tiến trình để ngăn toàn bộ hệ thống bị treo cứng. Thông thường, nó sẽ nhắm vào những ứng dụng nặng nhất: MySQL, Java hoặc Nginx. Tôi thà chấp nhận độ trễ tăng vọt 100ms tạm thời còn hơn là gặp lỗi 503 vì cơ sở dữ liệu bị sập. Các chiến lược hiện đại như Swapfile và zSwap cho phép bạn giữ được lưới an toàn đó mà không phải hy sinh tốc độ.

Thiết lập một Swapfile linh hoạt

Hãy quên các phân vùng đĩa (partition) chuyên dụng đi. Việc thay đổi kích thước một phân vùng trên máy chủ production đang chạy là một việc làm đầy rủi ro. Swapfile hiện là tiêu chuẩn ngành vì chúng cung cấp hiệu năng tương đương với phân vùng nhưng có thể thay đổi kích thước hoặc xóa bỏ dễ dàng như một tệp văn bản.

Tạo Swapfile

Bắt đầu bằng cách cấp phát không gian. Nếu máy chủ của bạn có ít hơn 4GB RAM, hãy đặt kích thước Swap bằng với RAM. Đối với các hệ thống lớn hơn, một vùng đệm cố định từ 2GB đến 4GB thường là đủ. Đây là cách tôi thiết lập Swapfile 4GB trên một node Ubuntu tiêu chuẩn:

# Sử dụng fallocate để cấp phát không gian ngay lập tức
sudo fallocate -l 4G /swapfile

# Trên các hệ thống tệp XFS cũ, sử dụng dd nếu fallocate thất bại:
# sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

Đừng bỏ qua việc phân quyền. Chỉ người dùng root mới có quyền đọc tệp này, vì nó thường chứa dữ liệu nhạy cảm được lấy trực tiếp từ bộ nhớ.

sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Thiết lập Swap vĩnh viễn

Việc kích hoạt thủ công sẽ không còn hiệu lực sau khi khởi động lại. Để thay đổi này trở nên vĩnh viễn, bạn phải cập nhật bảng hệ thống tệp (/etc/fstab). Luôn sao lưu tệp này trước—một lỗi đánh máy ở đây có thể khiến máy chủ của bạn không thể khởi động.

# Tạo bản sao lưu an toàn
sudo cp /etc/fstab /etc/fstab.bak

# Thêm mục nhập vào cuối tệp
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Tinh chỉnh: Swappiness và Cache Pressure

Các bản phân phối Linux tiêu chuẩn thường đi kèm with các thiết lập mặc định dành cho máy tính để bàn. Tham số kernel vm.swappiness kiểm soát mức độ tích cực của hệ thống khi di chuyển dữ liệu xuống đĩa. Giá trị mặc định thường là 60, mức này quá cao đối with hầu hết các máy chủ.

Điều chỉnh vm.swappiness

Giá trị dao động từ 0 đến 100. Đối với các tác vụ nặng về cơ sở dữ liệu, hãy đặt giá trị này thành 10 hoặc thậm chí là 1. Điều này nói với nhân Linux rằng: “Chỉ sử dụng đĩa nếu thực sự bắt buộc”. Điều này ngăn hệ thống rơi vào tình trạng “thrashing”—trạng thái mà nó dành nhiều thời gian để di chuyển dữ liệu qua lại hơn là thực sự chạy ứng dụng của bạn.

# Xem cài đặt hiện tại
cat /proc/sys/vm/swappiness

# Áp dụng thay đổi tạm thời để kiểm tra
sudo sysctl vm.swappiness=10

VFS Cache Pressure

Tham số kernel vm.vfs_cache_pressure quy định thời gian nhân Linux giữ dữ liệu thư mục và inode trong bộ nhớ. Trên các node production của tôi, tôi hạ giá trị này từ 100 xuống 50. Việc này giúp giữ metadata của tệp trong bộ nhớ đệm lâu hơn, giúp tăng tốc độ duyệt thư mục và tìm kiếm tệp.

Lưu các thay đổi này vĩnh viễn bằng cách thêm chúng vào /etc/sysctl.conf:

vm.swappiness=10
vm.vfs_cache_pressure=50

Tăng tốc tối đa với zSwap

zSwap là một “viên ngọc quý” tiềm ẩn cho hiệu năng. Nó hoạt động như một bộ nhớ đệm ghi ngược (write-back cache) được nén cho swap của bạn. Thay vì đẩy một trang bộ nhớ trực tiếp xuống ổ SSD chậm chạp, zSwap sẽ nén nó lại—thường với tỷ lệ 3:1—và giữ nó trong một vùng nhỏ (pool) ngay trong RAM.

I/O đĩa là nút thắt cổ chai cuối cùng. Bằng cách sử dụng một vài chu kỳ CPU cho việc nén zstd, bạn tránh được độ trễ khổng lồ khi ghi vào đĩa. Tôi đã thấy cách này giúp giảm thời gian chờ đĩa (disk wait times) đi 15% trong các đợt cao điểm truy cập trên các instance VPS 4GB. Những trang bộ nhớ cũ nhất chỉ bị đẩy vào Swapfile thực tế khi vùng nén đã đầy.

Kiểm tra hỗ trợ của kernel:

grep -i zswap /boot/config-$(uname -r)

Để kích hoạt nó khi khởi động, hãy chỉnh sửa cấu hình GRUB. Tôi khuyên bạn nên sử dụng trình nén zstd và giới hạn vùng nén ở mức 25% tổng lượng RAM.

# Chỉnh sửa /etc/default/grub
# Cập nhật GRUB_CMDLINE_LINUX_DEFAULT để bao gồm:
# zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=25

sudo update-grub

Kiểm tra & Giám sát thời gian thực

Các thiết lập sẽ vô ích nếu bạn không kiểm chứng chúng. Sử dụng swapon --show để kiểm tra trạng thái nhanh. Nó cho thấy chính xác tệp nào đang hoạt động và mức độ sử dụng hiện tại của chúng.

swapon --show
# NAME      TYPE  SIZE USED PRIO
# /swapfile file  4G   1.2G -2

Nếu bạn nghi ngờ hệ thống đang bị “thrashing”, hãy chạy vmstat 2. Hãy quan sát các cột si (swap-in) và so (swap-out). Nếu những con số này liên tục ở mức cao trong hơn vài giây, bạn cần nâng cấp RAM hoặc swappiness vẫn còn quá cao so với khối lượng công việc của bạn.

Để xem bạn thực sự tiết kiệm được bao nhiêu bộ nhớ nhờ nén, hãy kiểm tra các số liệu thống kê gỡ lỗi của kernel:

sudo grep -r . /sys/kernel/debug/zswap/

Tối ưu hóa Swap là một bài toán cân bằng. Bằng cách kết hợp một Swapfile có kích thước hợp lý với các tham số kernel đã được tinh chỉnh và nén zSwap, bạn có thể giữ cho máy chủ của mình ổn định dưới áp lực cực lớn. Đây là một sự tối ưu hóa mang lại giá trị cao, đảm bảo các dịch vụ của bạn luôn trực tuyến khi từng megabyte bộ nhớ đều quý giá.

Share: