Zstandard (zst) là gì? Thuật toán nén của Facebook
Phiên bản ngắn gọn: Zstandard thực sự là gì
Zstandard—thường được viết tắt là zstd với phần mở rộng tệp là .zst—là một thuật toán nén dữ liệu không mất mát (lossless data compression algorithm) do Yann Collet phát triển tại Facebook (nay là Meta). Nó được phát hành dưới dạng mã nguồn mở vào năm 2016 và nhanh chóng khẳng định vị thế của mình; nhân Linux (Linux kernel) đã tích hợp nó từ phiên bản 5.16. Bản thân Facebook cũng dựa vào zstd trên toàn bộ cơ sở hạ tầng khổng lồ của mình, nén mọi thứ từ các bản sao lưu database đến các tệp log. Định dạng này hiện là một tiêu chuẩn internet chính thức, được ghi chép đầy đủ trong RFC 8878. Về nguyên lý hoạt động, zstd kết hợp phương pháp LZ77 dựa trên từ điển với một bộ mã hóa entropy hiện đại có tên Asymmetric Numeral Systems (ANS). Nói một cách thực tế, điều này có nghĩa là nó nén và giải nén dữ liệu với tốc độ đáng kinh ngạc, thường không phải hy sinh nhiều tỷ lệ nén so với các thuật toán chậm hơn, truyền thống hơn. Phần mở rộng .zst biểu thị định dạng nén luồng đơn. Bạn cũng sẽ thấy .tar.zst, đây đơn giản là một kho lưu trữ tar được nén bằng zstd, giống như các định dạng quen thuộc .tar.gz hoặc .tar.bz2. Nếu gần đây bạn đã download một gói Linux, một bản sao lưu database, hoặc một bộ dữ liệu lớn, rất có thể đó là tệp .zst hoặc .tar.zst.
Zstandard so với gzip, bzip2 và xz như thế nào
Khi bạn chọn một công cụ nén, bạn luôn phải cân bằng ba yếu tố: kích thước đầu ra (tỷ lệ nén), tốc độ nén và tốc độ giải nén. Zstandard được thiết kế ngay từ đầu để đánh bại gzip nổi tiếng trên cả ba mặt cùng lúc—một tuyên bố nghe có vẻ quá tốt để là sự thật nhưng phần lớn là đúng. Các thử nghiệm của chính Facebook trên bộ dữ liệu Silesia, một bộ kiểm tra tiêu chuẩn, cho thấy zstd ở mức mặc định (level 3) đạt tỷ lệ 2.884x với tốc độ nén cực nhanh 500 MB/s và giải nén hơn 1.600 MB/s. Để so sánh, gzip ở mức mặc định đạt tỷ lệ 2.743x với tốc độ nén khoảng 130 MB/s và giải nén 400 MB/s. Các con số không hề nói dối: zstd nhanh hơn ở cả hai chiều và nén tệp chặt hơn một chút theo mặc định. Các công cụ khác như bzip2 có thể đạt tỷ lệ tốt hơn (khoảng 3.0x), nhưng với tốc độ chậm như rùa, thường dưới 20 MB/s cho việc nén. Và mặc dù xz đẩy tỷ lệ lên trên 3.2x, tốc độ nén dưới 10 MB/s của nó khiến nó không thể khởi động cho bất kỳ thứ gì nhạy cảm về thời gian. Sức mạnh thực sự của Zstd đến từ 22 mức nén của nó. Mức 1 là ưu tiên tốc độ, hoàn hảo để nén lưu lượng mạng trong thời gian thực. Ở phía ngược lại, các mức 19–22 (các chế độ "ultra") cạnh tranh với tỷ lệ nén của xz trong khi vẫn giải nén nhanh hơn một bậc. Hầu hết mọi người đều sử dụng trong khoảng 3–9. Trên Linux, bạn có thể dễ dàng kiểm soát điều này: `zstd -9 myfile.tar` sẽ tốn nhiều thời gian CPU hơn nhưng tạo ra một tệp nhỏ hơn so với lệnh mặc định `zstd -3 myfile.tar`.
Huấn luyện từ điển: Tính năng mà hầu hết mọi người bỏ qua
Nén dựa trên từ điển (Dictionary compression) là một trong những tính năng mạnh mẽ nhất—và bị bỏ qua nhiều nhất—của zstd. Các thuật toán nén tiêu chuẩn hoạt động bằng cách tìm các mẫu lặp lại bên trong một tệp duy nhất. Nhưng nếu tệp đó rất nhỏ, như một payload JSON 2 KB thì sao? Đơn giản là không đủ dữ liệu để thuật toán xây dựng một mô hình hữu ích về những gì được lặp lại, vì vậy tỷ lệ nén thường rất tệ. Trong một số trường hợp, tệp 'đã nén' thậm chí có thể lớn hơn tệp gốc. Huấn luyện từ điển là giải pháp. Bạn có thể cung cấp cho zstd một lượng lớn dữ liệu mẫu của mình—chẳng hạn, hàng nghìn tệp log nhỏ hoặc đối tượng JSON tương tự—và nó sẽ tạo ra một tệp từ điển duy nhất nắm bắt tất cả các mẫu chung của chúng. Sau đó, cả bộ nén và bộ giải nén đều sử dụng từ điển được chia sẻ này làm điểm khởi đầu. Facebook đã báo cáo đạt được tỷ lệ nén 6x trên các khối JSON nhỏ mà nếu không sử dụng kỹ thuật này thì hầu như không thể nén được chút nào. Để tự mình thử từ dòng lệnh, trước tiên bạn huấn luyện một từ điển: `zstd --train /path/to/samples/* -o mydict.zst-dict`. Sau đó bạn sử dụng nó để nén một tệp: `zstd -D mydict.zst-dict smallfile.json`. Vấn đề duy nhất là bộ giải nén cũng cần chính xác tệp từ điển đó. Điều này tạo ra một thách thức trong vận hành; bạn phải lưu trữ và phân phối từ điển cùng với dữ liệu của mình. Vậy ai thực sự sử dụng tính năng này? Đây là một yếu tố thay đổi cuộc chơi đối với các kỹ sư database, nhà phát triển backend nén phản hồi API và bất kỳ ai xử lý khối lượng lớn các tệp nhỏ có cấu trúc tương tự. Đối với người dùng thông thường chỉ cần nén một thư mục, zstd tiêu chuẩn là quá đủ rồi.
Nơi bạn thực sự gặp các tệp .zst
Bạn có thể đã sử dụng zstd mà không hề nhận ra. Thuật toán này đã lan rộng ra ngoài các máy chủ của Facebook và giờ đây là một phần quan trọng của hệ sinh thái phần mềm hiện đại. Dưới đây là một vài nơi cụ thể bạn sẽ tìm thấy các tệp .zst trong thực tế: **Các trình quản lý gói Linux.** Arch Linux đã chuyển từ .tar.xz sang .tar.zst vào năm 2020, với lý do cải thiện đáng kể tốc độ cài đặt gói. Fedora cũng đã làm theo. Khi bạn chạy `pacman -S` hoặc `dnf install`, bạn đang download và giải nén các tệp được nén .zst. **Bản thân nhân Linux.** Kể từ phiên bản 5.16, hình ảnh kernel (bzImage) và initramfs có thể được nén bằng zstd. Một số bản phân phối hiện nay mặc định xuất xưởng các kernel được nén bằng zstd để có thời gian khởi động nhanh hơn đáng kể. **Các hệ thống database và lưu trữ.** RocksDB của Facebook có hỗ trợ zstd gốc, cũng như ClickHouse, một database phân tích phổ biến nơi zstd là một codec được khuyến nghị. PostgreSQL 15 thậm chí còn bổ sung hỗ trợ zstd cho các thông báo sao chép logic của nó. **Các bản download bộ dữ liệu lớn.** Ghé thăm Hugging Face hoặc các kho lưu trữ học thuật khác, và bạn sẽ thấy nhiều bộ dữ liệu học máy hiện được phân phối dưới dạng tệp .zst hoặc .tar.zst. Ngay cả bộ dữ liệu Common Crawl, nổi tiếng trong lịch sử với các tệp .warc.gz, cũng đang xuất hiện nhiều hơn các bản xuất .zst. **Tài nguyên game và phân phối phần mềm.** Mozilla sử dụng zstd để phân phối các bản cập nhật Firefox hiệu quả hơn, và một số game engine sử dụng nó nội bộ để truyền tải tài nguyên nhanh chóng trong quá trình chơi game. Tin tốt là đối với hầu hết các trường hợp này, bạn không cần phải làm gì đặc biệt. Nếu bạn chỉ cần mở hoặc giải nén tệp, các công cụ hiện đại của hệ thống bạn, như 7-Zip (phiên bản 19.00 trở lên hỗ trợ .zst), sẽ tự động xử lý nó.
Mở và chuyển đổi tệp .zst mà không cần dòng lệnh
Thành thật mà nói, không phải ai cũng muốn sống trong terminal hoặc ghi nhớ các cờ nén. Nếu bạn được gửi một tệp .zst và chỉ cần lấy nội dung ra, bạn có một số tùy chọn đơn giản tùy thuộc vào hệ điều hành của mình. **Windows:** 7-Zip là người bạn tốt nhất của bạn ở đây. Nó đã thêm hỗ trợ zstd đầy đủ trong phiên bản 22.00 (phát hành tháng 7 năm 2022). Chỉ cần nhấp chuột phải vào tệp .zst, điều hướng đến '7-Zip > Extract Here', và bạn đã hoàn tất. Nếu nó không hoạt động, có thể bạn đang dùng phiên bản cũ hơn; tất cả những gì bạn cần làm là cập nhật nó. **macOS:** Tiện ích Archive Utility tích hợp chưa thể xử lý .zst (tính đến macOS Sequoia), nhưng trình lưu trữ Keka miễn phí và tuyệt vời thì làm được điều đó một cách hoàn hảo. Ngoài ra, nếu bạn sử dụng Homebrew, một lệnh `brew install zstd` nhanh chóng theo sau là `zstd -d file.zst` trong Terminal sẽ hoàn thành công việc. **Linux:** Bạn gần như chắc chắn đã được hỗ trợ. Công cụ dòng lệnh `zstd` có thể đã được cài đặt hoặc có sẵn trong trình quản lý gói của bạn. Để giải nén, chỉ cần chạy `zstd -d file.zst`. Đối với một kho lưu trữ tar, `tar --use-compress-program=zstd -xf file.tar.zst` là lệnh kinh điển, mặc dù nhiều hệ thống hiện đại cũng hỗ trợ lệnh đơn giản hơn `tar -I zstd -xf file.tar.zst`. **Chuyển đổi dựa trên trình duyệt:** Đây là nơi một công cụ như CocoConvert phát huy tác dụng. Nếu bạn cần giải nén một tệp .zst mà không cần cài đặt bất kỳ phần mềm nào, bạn có thể upload nó lên CocoConvert và giải nén nội dung ngay trong trình duyệt của mình. Điều này lý tưởng cho các tệp .zst luồng đơn có kích thước hợp lý. Đối với các kho lưu trữ .tar.zst khổng lồ, nhiều gigabyte hoặc các tệp phụ thuộc vào từ điển tùy chỉnh, một công cụ cục bộ sẽ thực tế hơn. CocoConvert minh bạch về điều này: nó được xây dựng để xử lý các trường hợp phổ biến một cách xuất sắc, không phải mọi trường hợp ngoại lệ có thể xảy ra.
Tạo tệp .zst: Khi nào nên và khi nào không nên
Zstandard là một lựa chọn tuyệt vời khi bạn nén tệp cho các đối tượng cụ thể: nhà phát triển, quản trị viên hệ thống hoặc các hệ thống tự động đã hỗ trợ nó. Nó hoàn hảo cho các kho lưu trữ nội bộ, phân phối phần mềm hoặc truyền dữ liệu mà việc giải nén nhanh chóng ở đầu bên kia là ưu tiên hàng đầu. Nhưng đó hoàn toàn là lựa chọn sai lầm nếu bạn gửi một tệp cho một người không rành về kỹ thuật và họ sẽ mở nó trên một máy Windows bình thường. Đối với công việc đó, Zip vẫn là vua. Mọi hệ điều hành hiện đại đều xử lý các tệp .zip ngay lập tức, không cần hỏi, không cần thêm phần mềm. Mặc dù zstd đang dần chiếm ưu thế, nhưng nó chưa đạt được mức độ đó cho việc chia sẻ tệp thông thường. Hãy bám vào những gì hoạt động hiệu quả. Tuy nhiên, đối với việc lưu trữ tệp của riêng bạn, câu chuyện lại khác. Sử dụng zstd ở mức cao hơn (như -9) là một sự thỏa hiệp tuyệt vời. Bất kỳ ai đã từng nhìn chằm chằm vào màn hình chờ đợi một thư mục 10 GB nén bằng xz đều hiểu nỗi đau—nó có thể mất 8–12 phút. Cùng một thư mục đó có thể chỉ mất 90 giây với `zstd -9`, cho ra một tệp chỉ lớn hơn một chút. Đó là một sự đánh đổi mà tôi sẽ chấp nhận bất cứ lúc nào. Để tạo một tệp .zst với CocoConvert, bạn có thể upload tệp nguồn của mình và chọn .zst làm định dạng đầu ra. Mức nén mặc định sẽ ổn cho hầu hết mọi thứ. Hãy nhớ rằng CocoConvert nén các tệp riêng lẻ. Nếu bạn muốn đóng gói toàn bộ một thư mục vào một kho lưu trữ .tar.zst duy nhất, bạn sẽ cần tạo tệp .tar trước trên máy của mình và sau đó nén nó, hoặc sử dụng một lệnh cục bộ như `tar -I zstd -cf output.tar.zst folder/`.
Tóm tắt chân thực: Zstandard có đáng để học không?
Hãy nói rõ: Zstandard không phải là một định dạng ngách nào đó có thể biến mất. Nó được nhúng sâu vào nhân Linux, được các database lớn sử dụng và được các trình quản lý gói cho các bản phân phối Linux khổng lồ chấp nhận. Với sự hậu thuẫn từ Meta và một cộng đồng mã nguồn mở phát triển mạnh, cùng với tiêu chuẩn hóa RFC chính thức, nó được đảm bảo sẽ là một phần ổn định, lâu dài của hệ sinh thái phần mềm. Đối với các nhà phát triển và quản trị viên hệ thống (sysadmins), việc học cách sử dụng zstd đang trở thành một kỹ năng cơ bản. Hiểu được sự đánh đổi giữa các mức nén, biết khi nào từ điển có thể giúp bạn tiết kiệm và nắm bắt mối quan hệ giữa .zst và .tar.zst sẽ trực tiếp giúp bạn tiết kiệm thời gian và tài nguyên khi quản lý cơ sở hạ tầng hiện đại. Đối với người dùng thông thường, điều cần rút ra đơn giản hơn nhiều. Nếu bạn thấy một tệp .zst, bạn biết nó là gì: một kho lưu trữ đã nén. Nó không phải là một video hay một tài liệu lạ, chỉ là một container. Và bạn biết mình có những cách dễ dàng để mở nó, cho dù đó là cập nhật 7-Zip trên Windows, tải Keka cho macOS, hay sử dụng một công cụ web như CocoConvert. Nhưng zstd vẫn chưa chinh phục được mọi thứ. Điểm yếu còn lại của nó là chia sẻ tệp thông thường, giữa người với người. Cho đến khi Windows và macOS có thể mở các tệp .zst chỉ bằng cách nhấp đúp vào chúng, theo cách chúng làm với .zip, nó sẽ vẫn là một định dạng đòi hỏi một chút nỗ lực hơn từ người nhận. Đối với gần như mọi thứ khác—tải công việc máy chủ, phân phối phần mềm, nén database và lưu trữ quy mô lớn—zstd đã chiến thắng. Nó là mặc định hợp lý mới, và vì những lý do rất chính đáng.