Nén và giải nén trên Linux: Đừng để ‘treo’ server vì chọn sai định dạng

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

Nén file: Không chỉ là tiết kiệm dung lượng

Nếu từng quản trị server, chắc hẳn bạn đã gặp cảnh ổ cứng báo đỏ (99%) vì log file phình to hoặc cần chuyển hàng chục GB dữ liệu giữa các máy chủ. Lúc này, nén file là cứu cánh duy nhất để giải phóng không gian và tiết kiệm băng thông khi truyền tải.

Hồi mới làm sysadmin, mình từng nén một folder backup 100GB bằng xz ngay trên server production. Kết quả là CPU nhảy vọt lên 100%, server lag đến mức không SSH vào được. Mình mất cả buổi chiều xử lý chỉ vì không hiểu đặc tính của từng công cụ. Mỗi định dạng (gzip, bzip2, xz, zstd) đều có sự đánh đổi giữa tốc độtỷ lệ nén.

Trước khi bắt đầu, bạn cần phân biệt rõ hai khái niệm:

  • Archiving (Đóng gói): Gom nhiều file thành một file duy nhất bằng tar.
  • Compression (Nén): Sử dụng thuật toán để thu nhỏ kích thước file đó.

Cài đặt các công cụ cần thiết

Hầu hết các bản phân phối như Ubuntu hay CentOS đều có sẵn tar, gzip. Tuy nhiên, các công cụ mạnh mẽ như xz hay zstd (từ Facebook) thường phải cài thêm.

# Cho Ubuntu/Debian
sudo apt update && sudo apt install tar gzip bzip2 xz-utils zstd -y

# Cho RHEL/CentOS/AlmaLinux
sudo dnf install tar gzip bzip2 xz zstd -y

Chi tiết các định dạng nén phổ biến

1. Lệnh tar – “Xương sống” của việc đóng gói

tar (Tape Archive) là công cụ cơ bản nhất. Bản chất nó chỉ gom file thành một khối chứ không làm giảm dung lượng. Tuy nhiên, nó có thể kết hợp với các trình nén khác qua các flag.

# Đóng gói không nén (tạo file .tar)
tar -cvf backup.tar /path/to/folder

# Giải nén
tar -xvf backup.tar

Các flag cần nhớ: -c (Create), -x (Extract), -v (Verbose – xem tiến trình), và -f (File).

2. Gzip (.tar.gz) – Cân bằng và phổ biến

Đây là tiêu chuẩn “quốc dân”. Nếu bạn cần nén nhanh để gửi file cho đồng nghiệp hoặc backup định kỳ, hãy dùng flag -z.

# Nén nhanh với gzip
tar -czvf data.tar.gz /data

Thực tế: Một file log 1GB có thể nén xuống còn khoảng 200MB chỉ trong vòng 30 giây. Gzip tốn rất ít tài nguyên CPU.

3. XZ (.tar.xz) – Vô địch về tỷ lệ nén

Khi dung lượng lưu trữ là ưu tiên hàng đầu, xz (flag -J) là lựa chọn số một. Nó thường được dùng để đóng gói mã nguồn hoặc bản backup lâu dài.

tar -cJvf data.tar.xz /data

Cảnh báo: Đừng dùng xz trên các server yếu. Để nén cùng một file 1GB ở trên, xz có thể nén xuống còn 100MB nhưng mất tới 5 phút và ngốn sạch RAM.

4. Zstd (.tar.zstd) – Ngôi sao hiện đại

Zstandard là công cụ mình ưu tiên nhất hiện nay. Nó cực kỳ linh hoạt, cho phép tùy chỉnh mức độ nén và hỗ trợ đa nhân CPU.

# Nén với zstd
tar --zstd -cvf data.tar.zst /data

Điểm ăn tiền của zstd là tốc độ giải nén cực nhanh, gần như tương đương với việc đọc file không nén.

So sánh hiệu suất thực tế

Dưới đây là bảng so sánh dựa trên kinh nghiệm quản trị hệ thống thực tế của mình:

Định dạng Tốc độ Tỷ lệ nén Tình huống sử dụng
Gzip Nhanh Khá (5:1) Backup hàng ngày, web server.
XZ Rất chậm Tốt nhất (10:1) Lưu trữ lâu dài (Archiving).
Zstd Rất nhanh Tốt (7:1) Dữ liệu lớn, Database, Real-time.

Mẹo theo dõi tiến độ với file lớn

Lệnh tar mặc định không hiển thị thanh tiến trình. Khi nén file hàng trăm GB, bạn sẽ không biết khi nào nó xong. Hãy dùng pv (Pipe Viewer) để giải quyết vấn đề này:

# Cài pv và nén kèm thanh tiến độ
tar -cf - /path/to/data | pv -s $(du -sb /path/to/data | awk '{print $1}') | gzip > data.tar.gz

Lúc này, màn hình sẽ hiển thị rõ tốc độ (MB/s) và thời gian dự kiến hoàn thành. Rất chuyên nghiệp!

Lời kết: Nên chọn cái nào?

Mỗi công cụ đều có thế mạnh riêng tùy vào tài nguyên server của bạn:

  • Cần nhanh, máy chủ yếu: Hãy chọn gzip.
  • Muốn tiết kiệm dung lượng tối đa: xz là vô địch.
  • Máy chủ hiện đại, nhiều nhân CPU: Tuyệt đối nên dùng zstd.

Hy vọng bài viết này giúp bạn không còn lúng túng khi đứng trước các lựa chọn nén file. Đừng quên test thử trên môi trường staging trước khi thực hiện các tác vụ nặng trên production nhé!

Share: