Khi 4KB trở thành nút thắt cổ chai lúc 2 giờ sáng
Chuyện xảy ra vào lúc 2 giờ sáng, khi mình đang vật lộn với cụm Redis và PostgreSQL trên Proxmox. Dù RAM còn trống cả đống, CPU load thấp, ứng dụng vẫn báo latency cao bất thường. Hệ thống chạy cứ “khựng khựng” dù phần cứng thuộc hàng khủng. Sau khi soi bằng perf và /proc/meminfo, mình phát hiện thủ phạm chính là TLB (Translation Lookaside Buffer) miss quá cao.
Mặc định, Linux quản lý bộ nhớ theo các trang (pages) 4KB. Với một máy ảo 32GB RAM, hệ thống phải gánh hơn 8 triệu trang. Mỗi lần CPU cần dữ liệu, nó phải tra cứu bảng phân trang khổng lồ này. Khi bảng vượt quá khả năng lưu trữ của cache (TLB), CPU buộc phải truy xuất RAM liên tục chỉ để… tìm xem dữ liệu nằm ở đâu. Huge Pages sinh ra để dẹp bỏ sự lãng phí này bằng cách tăng kích thước trang lên 2MB hoặc 1GB.
Dàn homelab của mình hiện chạy 12 VM và container. Đây là nơi mình thử nghiệm mọi thứ trước khi đẩy lên production. Kinh nghiệm thực tế cho thấy với các workload nặng như Database, bạn đang lãng phí 10-15% hiệu năng CPU chỉ để quản lý bộ nhớ nếu không dùng Huge Pages.
Ba cách quản lý bộ nhớ: Chọn cái nào?
1. Standard Pages (4KB) – Quen thuộc nhưng tốn sức
Đây là cấu hình mặc định, rất linh hoạt cho các tiến trình nhỏ. Tuy nhiên, với máy ảo vài chục GB RAM, nó trở thành gánh nặng vì số lượng trang quá lớn khiến CPU đuối sức khi tra cứu.
2. Transparent Huge Pages (THP) – Tiện lợi nhưng rủi ro
Linux sẽ tự động gom các trang 4KB thành 2MB khi thấy cần. Nghe thì hay, nhưng thực tế production thường bị “lag” bất chợt. Tiến trình khugepaged khi quét và gom trang thường gây block I/O. Các chuyên gia Oracle hay Redis luôn khuyên tắt tính năng này đầu tiên.
3. Static Huge Pages – Chậm mà chắc
Đây là lựa chọn ưu tiên của mình. Chúng ta cấp phát cứng một lượng RAM làm Huge Pages ngay lúc boot. Lượng RAM này bị “chiếm dụng” hoàn toàn, không thể bị swap out. Cách này mang lại hiệu suất ổn định và cao nhất cho ảo hóa KVM.
Cân nhắc ưu và nhược điểm
- Điểm cộng:
- Giảm TLB miss rõ rệt. CPU tập trung xử lý logic thay vì đi tra bảng.
- Bộ nhớ được khóa (pinned) vào RAM vật lý. Không bao giờ bị đẩy xuống Swap, đảm bảo latency cực thấp.
- Kernel rảnh tay hơn vì bảng phân trang nhẹ đi đáng kể.
- Điểm trừ:
- RAM cấp cho Huge Pages là RAM “một đi không trở lại”. Nếu VM không dùng hết, các tiến trình khác cũng không thể mượn dùng.
- Cần khởi động lại host để cấu hình có hiệu lực ổn định, tránh phân mảnh bộ nhớ.
- Vô hiệu hóa tính năng RAM Ballooning (tự động co giãn RAM máy ảo).
Tại sao mình chọn Static Huge Pages cho Proxmox?
Nếu bạn làm hosting nhỏ, RAM Ballooning là cứu cánh để overcommit tài nguyên. Nhưng với Database doanh nghiệp, sự ổn định là ưu tiên số một. Mình sẵn sàng đổi sự linh hoạt lấy việc Redis không bao giờ bị giật lag do page fault. Với máy chủ 128GB RAM, mình thường trích hẳn 64GB-80GB cố định cho Huge Pages.
Hướng dẫn triển khai chi tiết
Các bước dưới đây giúp bạn cấu hình Huge Pages 2MB – loại phổ biến và dễ triển khai nhất hiện nay.
Bước 1: Soi thông tin phần cứng
Trước hết, hãy xác nhận CPU của bạn có hỗ trợ Huge Pages bằng lệnh:
grep -i hugepages /proc/meminfo
Bước 2: Cài đặt Kernel Parameter
Chúng ta sẽ sửa Grub để cấp phát RAM ngay khi khởi động. Ví dụ: cấp 20GB RAM cho Huge Pages (loại 2MB), tương đương với 10240 trang.
nano /etc/default/grub
Chèn thêm các tham số vào dòng GRUB_CMDLINE_LINUX_DEFAULT:
# Cấp 10240 trang 2MB = 20GB
GRUB_CMDLINE_LINUX_DEFAULT="quiet default_hugepagesz=2M hugepagesz=2M hugepages=10240"
Cập nhật lại grub và khởi động lại máy chủ:
update-grub
reboot
Bước 3: Kiểm tra thành quả
Sau khi máy lên, chạy lệnh này để xem RAM đã được “đặt chỗ” chưa:
grep Huge /proc/meminfo
Chỉ số HugePages_Free sẽ xấp xỉ con số 10240 bạn vừa cấu hình.
Bước 4: Áp dụng cho máy ảo (VM)
Bây giờ, hãy yêu cầu Proxmox cấp RAM cho máy ảo từ nguồn Huge Pages thay vì RAM thường.
Dùng CLI cho nhanh:
# Thay 100 bằng ID máy ảo của bạn
qm set 100 -hugepages 2
Lưu ý quan trọng: Bạn phải tắt hẳn máy ảo và bật lại (Power Cycle) thì cấu hình mới chính thức có tác dụng.
Bước 5: Xác nhận lần cuối
Khi máy ảo đang chạy, hãy kiểm tra lại trên host:
grep HugePages_Free /proc/meminfo
Nếu Free giảm đi đúng bằng dung lượng RAM máy ảo, chúc mừng bạn. Hệ thống của bạn hiện đang “bay” trên bộ nhớ tốc độ cao.
Vài lưu ý nhỏ từ thực tế
Với các VM cực lớn (trên 64GB RAM), Huge Pages loại 1GB (hugepagesz=1G) sẽ cho hiệu quả tốt hơn. Tuy nhiên, nó đòi hỏi phần cứng hỗ trợ khắt khe hơn một chút.
Ngoài ra, Snapshot máy ảo kèm RAM (Include RAM) có thể gặp lỗi trên một số phiên bản QEMU cũ khi dùng Huge Pages. Hãy luôn test kỹ quy trình backup sau khi thay đổi hạ tầng.
Tối ưu hệ thống không phải là phép màu, mà là hiểu rõ cách kernel và phần cứng vận hành. Hy vọng kinh nghiệm thức đêm này giúp anh em tối ưu hệ thống mượt mà hơn!

