Back to articles
Technology Insight

Tối Ưu Hóa Swap Nâng Cao: Kết Hợp Google Allocator (TCMalloc) và ZRAM Trên Linux VPS Cấu Hình Thấp

June 3, 2026

Giới thiệu về bài toán bộ nhớ trên Linux VPS cấu hình thấp

Đối với các nhà quản trị hệ thống và lập trình viên, vận hành một Linux VPS cấu hình thấp (chẳng hạn như các gói Cloud Server 1 vCPU và 1GB hoặc 2GB RAM) luôn là một thử thách lớn. Khi chạy các ứng dụng hiện đại như WordPress (với PHP-FPM, MySQL), Node.js, hoặc Docker containers, hệ thống rất dễ rơi vào trạng thái cạn kiệt bộ nhớ vật lý (RAM). At thời điểm này, nhân Linux (Kernel) buộc phải kích hoạt cơ chế swap để chuyển các trang bộ nhớ ít sử dụng xuống ổ đĩa cứng (SSD/HDD).

Tuy nhiên, cơ chế swap truyền thống trên ổ đĩa đi kèm một cái giá rất đắt: Độ trễ I/O tăng vọt và hiện tượng Disk Thrashing (ổ đĩa bị đọc/ghi liên tục) khiến hệ thống gần như đóng băng. Để giải quyết triệt để bài toán này, chúng ta cần một giải pháp lai nâng cao: Kết hợp công nghệ nén RAM trực tiếp ZRAM ở tầng kernel và bộ cấp phát bộ nhớ hiệu năng cao TCMalloc (Google Allocator) ở tầng ứng dụng. Bài viết này sẽ hướng dẫn bạn từng bước thiết lập hệ thống tối ưu này.

ZRAM và TCMalloc: Cặp bài trùng tối ưu RAM vật lý

1. ZRAM là gì và tại sao nó tối ưu hơn Swap truyền thống?

ZRAM (trước đây gọi là compcache) là một module của nhân Linux giúp tạo ra một thiết bị khối (block device) dạng nén ngay trong bộ nhớ RAM vật lý. Thay vì ghi dữ liệu swap xuống ổ đĩa SSD (vốn có tuổi thọ ghi/xóa giới hạn và tốc độ chậm hơn RAM hàng trăm lần), Kernel sẽ nén dữ liệu đó lại bằng các thuật toán siêu tốc như lzo-rle hoặc lz4 rồi lưu ngay tại một phân vùng đặc biệt trong RAM.

Với tỷ lệ nén thông thường khoảng 2:1 đến 3:1, một phân vùng ZRAM kích thước 1GB có thể chứa tới 2GB đến 3GB dữ liệu swap, giúp nhân đôi dung lượng bộ nhớ khả dụng trên các VPS cấu hình thấp mà không làm giảm tốc độ phản hồi của hệ thống.

2. Google Allocator (TCMalloc) là gì?

TCMalloc (Thread-Caching Malloc) là một thư viện cấp phát bộ nhớ mã nguồn mở được phát triển bởi Google, nằm trong bộ công cụ Google Performance Tools (gperftools). Mặc định, các ứng dụng trên Linux sử dụng bộ cấp phát của hệ thống (glibc malloc). Tuy nhiên, glibc malloc thường gặp phải hai nhược điểm lớn trên các hệ thống đa luồng (multi-threaded):

  • Lock Contention (Xung đột khóa): Các luồng phải chờ đợi lẫn nhau để giành quyền cấp phát bộ nhớ từ một pool chung.
  • Memory Fragmentation (Mảnh vỡ bộ nhớ): Tạo ra các khoảng trống nhỏ không thể tái sử dụng, khiến lượng bộ nhớ thực tế (RSS - Resident Set Size) phình to vô tội vạ.

TCMalloc giải quyết vấn đề này bằng cách gán cho mỗi CPU hoặc mỗi Thread một bộ đệm ẩn (Cache) riêng biệt. Các tác vụ cấp phát dung lượng nhỏ sẽ được xử lý ngay tại Thread-local Cache mà không cần khóa hệ thống, giúp đẩy tốc độ xử lý lên tối đa và gom cụm bộ nhớ cực kỳ ngăn nắp, giảm thiểu hiện tượng rò rỉ và phình RAM.

Hướng dẫn cấu hình chi tiết trên Linux (Ubuntu/Debian)

Bước 1: Cài đặt và cấu hình tối ưu ZRAM

Đầu tiên, chúng ta sẽ thiết lập ZRAM làm phân vùng swap ưu tiên cao nhất thay thế cho swap trên ổ đĩa. Hãy cài đặt gói công cụ điều khiển ZRAM:

sudo apt update
sudo apt install zram-tools -y

Sau khi cài đặt, tiến hành chỉnh sửa tệp cấu hình của ZRAM:

sudo nano /etc/default/zramswap

Cấu hình tệp tin với các thông số tối ưu cho VPS cấu hình thấp như sau:

# Sử dụng toàn bộ các nhân CPU khả dụng để nén dữ liệu
CORES=$(nproc)

# Chỉ định dung lượng RAM tối đa cấp cho ZRAM (Ví dụ: 100% dung lượng RAM thực tế)
# Đối với VPS 1GB-2GB, thiết lập 100% hoặc 150% là tối ưu nhờ thuật toán nén.
PERCENTAGE=100

# Thuật toán nén ưu tiên: lz4 hoặc lzo-rle (tốc độ nhanh, tốn ít CPU)
ALGO=lz4

# Độ ưu tiên của ZRAM (phải cao hơn swap truyền thống trên SSD)
PRIORITY=100

Khởi động lại dịch vụ ZRAM để áp dụng cấu hình:

sudo systemctl restart zramswap

Kiểm tra trạng thái kích hoạt bằng lệnh: sudo swapon --show. Bạn sẽ thấy thiết bị /dev/zram0 xuất hiện với độ ưu tiên (Priority) là 100.

Bước 2: Cấu hình Kernel thông qua Sysctl

Để tận dụng tối đa ZRAM, ta cần cấu hình lại cách thức nhân Linux quản lý bộ nhớ đệm thông qua tệp tin /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Thêm các dòng cấu hình chuyên sâu sau vào cuối tệp:

# Khuyến khích hệ thống đẩy dữ liệu sang ZRAM sớm hơn để giải phóng RAM vật lý cho ứng dụng
vm.swappiness=100

# Tăng áp lực giải phóng bộ đệm inode/dentry cache để tránh nghẽn RAM
vm.vfs_cache_pressure=500

# Giảm tỷ lệ ghi bất đồng bộ xuống ổ đĩa để tránh nghẽn I/O
vm.dirty_background_ratio=5
vm.dirty_ratio=10

Nạp lại cấu hình hệ thống bằng lệnh: sudo sysctl -p.

Bước 3: Tích hợp Google Allocator (TCMalloc) vào hệ thống

Để cài đặt thư viện TCMalloc từ Google, thực hiện lệnh:

sudo apt install libgoogle-perftools4 libgoogle-perftools-dev -y

Sau khi cài đặt thành công, chúng ta cần tìm đường dẫn chính xác của file thư viện chia sẻ (libtcmalloc.so) trên hệ thống:

find /usr/lib -name "libtcmalloc.so*"

Thông thường trên hệ thống Ubuntu 64-bit, đường dẫn sẽ có dạng: /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.

Bước 4: Ép ứng dụng sử dụng TCMalloc bằng cơ chế LD_PRELOAD

Có hai cách để áp dụng TCMalloc: Áp dụng cho toàn bộ hệ thống hoặc chỉ áp dụng cho một ứng dụng cụ thể (Khuyên dùng cho các ứng dụng nặng như Nginx, PHP-FPM hoặc MySQL/MariaDB).

Cách 1: Áp dụng cho một dịch vụ cụ thể (Ví dụ: MariaDB/MySQL)
Sử dụng tính năng override của systemd để nạp thư viện trước khi ứng dụng khởi chạy:

sudo systemctl edit mariadb

Trình chỉnh sửa hiện ra, hãy thêm đoạn mã sau vào giữa các dòng hướng dẫn:

[Service]
Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4"

Lưu lại và khởi động lại dịch vụ:

sudo systemctl daemon-reload
sudo systemctl restart mariadb

Cách 2: Áp dụng trên quy mô toàn hệ thống (Global)
Nếu bạn muốn mọi tiến trình sinh ra đều được tối ưu bộ nhớ bởi bộ phân bổ của Google, hãy thêm biến môi trường vào tệp cấu hình hệ thống:

echo "LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4" | sudo tee -a /etc/environment

Lưu ý: Khởi động lại VPS để cấu hình global có hiệu lực hoàn toàn.

Đánh giá hiệu quả thực tế và Giám sát hệ thống

Sau khi triển khai bộ đôi ZRAM và TCMalloc, bạn có thể theo dõi hiệu năng hệ thống thông qua các công cụ dòng lệnh tiêu chuẩn. Để kiểm tra hiệu quả nén dữ liệu của ZRAM, hãy chạy lệnh:

zramctl

Kết quả hiển thị sẽ bao gồm dung lượng gốc (DISKSIZE), dung lượng sau nén (DATA) và lượng RAM vật lý thực tế bị chiếm dụng (COMPR). Bạn sẽ thấy một lượng lớn dữ liệu rác hoặc dữ liệu chờ được nén chặt, giải phóng không gian trống cho các tác vụ tính toán thời gian thực.

Để kiểm tra xem ứng dụng đã nạp thành công TCMalloc hay chưa, hãy sử dụng lệnh kiểm tra các phân vùng ánh xạ bộ nhớ của tiến trình (thay thế $PID bằng ID tiến trình của ứng dụng):

sudo cat /proc/$PID/maps | grep tcmalloc

Nếu lệnh trả về các dòng chứa đường dẫn tới tcmalloc, ứng dụng của bạn đã được tiếp sức bởi công nghệ quản lý bộ nhớ đỉnh cao từ Google.

Kết luận

Tối ưu hóa một máy chủ Linux VPS cấu hình thấp không đơn thuần là cắt giảm tính năng, mà là phân phối tài nguyên một cách thông minh hơn. Bằng việc kích hoạt ZRAM, chúng ta loại bỏ được nút thắt cổ chai lớn nhất về tốc độ của ổ đĩa khi xảy ra hiện tượng tràn bộ nhớ. Đồng thời, việc tích hợp TCMalloc giúp dọn dẹp triệt để các mảnh vỡ RAM ở tầng ứng dụng, giúp VPS vận hành mượt mà, ổn định với hiệu năng p99 latency cải thiện rõ rệt. Đây là phương pháp hiệu quả giúp tiết kiệm chi phí nâng cấp phần cứng mà vẫn đảm bảo độ tin cậy cho hệ thống của bạn.

Tối Ưu Hóa Swap Nâng Cao: Kết Hợp Google Allocator (TCMalloc) và ZRAM Trên Linux VPS Cấu Hình Thấp | DPTCloud