Swap, ZRAM, Zswap và Hibernate trên NixOS: Cấu hình đúng cách

Công nghệ23 tháng 9, 2026·6 phút đọc

Bài viết phân tích cách cấu hình swap, zswap và zram trên NixOS để hỗ trợ tính năng hibernate, đồng thời làm rõ những hiểu lầm phổ biến giữa zram và zswap. Tác giả chia sẻ cấu hình tối giản chỉ với vài dòng nhưng mang lại hiệu quả cao cho máy tính để bàn và laptop.

Swap, ZRAM, Zswap và Hibernate trên NixOS: Cấu hình đúng cách

Swap, ZRAM, Zswap và Hibernate trên NixOS: Cấu hình đúng cách

Bài viết gốc được tách ra từ một bài viết lớn hơn về những cấu hình NixOS ít ai ngờ tới. Tác giả chia sẻ kinh nghiệm thực tế về việc sử dụng swap, zram và zswap trên hệ thống NixOS, đặc biệt trong bối cảnh cần hỗ trợ tính năng hibernate.

Câu chuyện bắt đầu từ một chủ đề gây tranh cãi muôn thuở: có nên dùng swap hay không? Vấn đề thường trở nên rối rắm vì nhiều người nhầm lẫn giữa khuyến nghị dành cho server và khuyến nghị dành cho máy trạm. Trong trường hợp này, tác giả tập trung vào máy để bàn và laptop.

Vì sao vẫn nên dùng swap?

Lý do chính để dùng swap là tính năng suspend-then-hibernate (tạm dịch: treo máy rồi ngủ đông), hay còn gọi là "Standby, then hibernate" trong cài đặt KDE. Cơ chế này hoạt động theo hai bước: đầu tiên máy chuyển sang trạng thái ACPI S3 suspend to RAM, sau một khoảng thời gian sẽ tự động chuyển sang S4 hibernate.

Đây là sự cân bằng hợp lý: nếu bạn rời máy một lát thì không phải chờ khởi động lại, nhưng cũng không lo quên tắt máy hoàn toàn.

Để dùng hibernate, bạn bắt buộc phải có swap nhằm lưu trạng thái hệ thống xuống đĩa. Đây là điểm then chốt mà nhiều người bỏ qua khi tranh luận về swap.

Swap file hay swap partition?

Một cuộc tranh cãi khác là nên dùng swap file hay swap partition. Điểm cần lưu ý là swap file có thể gây phức tạp cho hibernate, bởi vì khi khôi phục từ hibernate, initramfs cần biết vị trí của vùng swap trước khi các hệ thống tập tin được gắn kết. Trên hệ thống UEFI, thông tin này được lưu vào một biến EFI khi quá trình hibernate bắt đầu.

Với máy để bàn, tác giả dùng swap partition đơn giản:

swapDevices = [
  {device = "/dev/disk/by-uuid/f2fc399a-9703-450b-88df-5671b776fc71";}
];

Với laptop, tác giả dùng mã hóa LUKS kèm swap file:

fileSystems."/.swapvol" = {
  device = "/dev/disk/by-uuid/33682d1d-87c4-4166-8d3b-66d900387e42";
  fsType = "btrfs";
  options = ["subvol=swap"];
};
...
swapDevices = [
  {
    device = "/.swapvol/swapfile";
    size = 32 * 1024;
  }
];

Tin tốt là từ một thời gian nay, NixOS đã hiểu được những phức tạp của hibernate trên swap file và có thể tự xử lý việc tính toán offset.

Cấu hình hiện tại: Đơn giản nhưng hiệu quả

Nếu đã dùng swap thì nên dùng cho đúng cách. Hai bài viết tham khảo quan trọng là "In Defence of Swap" và bài tiếp theo "Debunking zswap and zram myths". Điểm khởi đầu được Chris Down khuyến nghị là dùng zswap kết hợp với swap trên đĩa.

Cấu hình hiện tại của tác giả chỉ đơn giản như sau:

boot.zswap.enable = true;
boot.kernel.sysctl."vm.swappiness" = 100;

Chỉ có vậy thôi. Cấu hình ngắn gọn không có nghĩa là nó kém quan trọng.

Vì sao lại là swappiness bằng 100?

Swappiness kiểm soát chi phí tương đối giữa việc swap và phân trang hệ thống tập tin, nên giá trị phù hợp sẽ phụ thuộc vào phần cứng cụ thể. Chris gợi ý rằng swappiness = 100 hoạt động tốt trên hệ thống dùng SSD, nhưng cũng lưu ý rằng "rất khó để tinh chỉnh giá trị này chỉ dựa trên trực giác" và bạn nên thử nghiệm với nhiều giá trị khác nhau.

Tài liệu của nhân Linux cũng đồng tình và cho biết trên SSD bạn thậm chí có thể đặt giá trị cao hơn. Tuy nhiên, tác giả chưa tìm thấy hướng dẫn rõ ràng nào về cách kiểm tra và so sánh các giá trị swappiness khác nhau, đặc biệt cho nhu cầu sử dụng máy trạm. Hiện tại, giá trị 100 đang phát huy tác dụng tốt trên các SSD của tác giả.

Những sai lầm trên đường đi

Trước khi đọc bài viết thứ hai của Chris, tác giả đã dùng zramSwap.enable vì tưởng rằng đó là điều được khuyến nghị. Nhưng thực tế hoàn toàn ngược lại. zramSwap chính là zram mà mọi người thường nhắc đến, và nó không phù hợp khi bạn dùng swap trên đĩa. Với trường hợp cần hibernate, đây là lựa chọn sai lầm.

Sau khi nhận ra, tác giả đã bỏ zramSwap.enable và chuyển sang boot.zswap:

boot.initrd.systemd.enable = true;
boot.zswap = {
  enable = true;
  compressor = "lz4";
};
boot.kernel.sysctl."vm.swappiness" = 100;

Thuật toán nén cho zswap có thể điều chỉnh qua boot.zswap.compressor. Nhân Linux mặc định dùng lzo vì cân bằng tốt giữa tốc độ và tỷ lệ nén. Trong khi đó, NixOS mặc định dùng zstd với lý do tỷ lệ nén tốt nhất và phù hợp cho các bản build Nix.

Trước đây tác giả dùng lz4 với tốc độ nén nhanh nhất và độ trễ thấp nhất, sau khi tham khảo ArchWiki. Nhưng thực tế, tốc độ nén thường không phải là yếu tố giới hạn khi bộ nhớ tràn ra đĩa. Tỷ lệ nén tốt hơn cho phép nhiều trang bộ nhớ nằm trong vùng đệm nén, nhờ đó ít phải dùng đến đĩa hơn.

Hiện tại tác giả dùng giá trị mặc định zstd của NixOS. Khi thêm cấu hình đó, lz4 yêu cầu boot.initrd.systemd.enable, nhưng thiết lập này nay đã mặc định là true nên có thể bỏ dòng đó đi. Kết quả cuối cùng chỉ còn lại hai dòng cấu hình.

Kết luận cho người dùng Việt Nam

Với những ai đang dùng NixOS tại Việt Nam và muốn tính năng hibernate hoạt động ổn định trên laptop, bài học chính rất rõ ràng:

  • Phân biệt rõ zram và zswap: zram dùng một vùng RAM nén làm swap, còn zswap là bộ đệm nén trước khi ghi ra đĩa. Nếu muốn hibernate, bạn cần zswap kết hợp swap trên đĩa.
  • Dùng swap partition hoặc swap file trên subvolume riêng để hibernate hoạt động đúng, đặc biệt trên hệ thống UEFI và mã hóa LUKS.
  • Đặt swappiness = 100 trên SSD là điểm khởi đầu hợp lý, nhưng nên thử nghiệm để tìm giá trị tối ưu cho phần cứng của bạn.
  • Để NixOS dùng zstd mặc định thay vì tự đổi sang lz4, vì tỷ lệ nén tốt hơn giúp giảm áp lực lên đĩa.

Cấu hình ngắn không có nghĩa là đơn giản, mà là kết quả của quá trình hiểu đúng vấn đề và tránh những sai lầm phổ biến.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗