Архиватор Zstandard/ZSTD - максимальная скорость сжатия

  • Автор темы Автор темы zer0coder
  • Дата начала Дата начала
Нужно мне было ужать данные, примерно 50 гигов, вот понял что архиватор zip будет ужимать часа 3 что-ли.

Решил что ждать столько не хочу и решил посмотреть, что там по скоростным архиваторам и...

Нашел, Zstandard/ZSTD вообще классная штука, упаковал за 30 минут.)

Zstandard — современный алгоритм сжатия, разработанный Facebook, ныне Meta.

Обычно используется расширение:

Код:
.zst

Например:

Код:
database.sql.zst

Сжатие:

Bash:
zstd database.sql

Распаковка:

Bash:
unzstd database.sql.zst

или:

Bash:
zstd -d database.sql.zst

---

# Главное преимущество ZSTD — скорость

Zstandard проектировался таким образом, чтобы обеспечить очень хорошее соотношение:

Код:
скорость <-> степень сжатия

Именно поэтому он получил широкое распространение в современных системах.

На стандартных уровнях ZSTD обычно способен сжимать данные значительно быстрее GZIP, а распаковывать — особенно быстро.

Это важно для:

  • серверов;
  • резервного копирования;
  • логов;
  • баз данных;
  • CI/CD;
  • контейнеров;
  • больших архивов.

Если архив имеет размер десятки или сотни гигабайт, разница во времени может быть весьма существенной.

---

# Уровни сжатия ZSTD

ZSTD позволяет выбирать уровень сжатия.

Например:

Bash:
zstd -1 file

Очень быстрое сжатие.

Или:

Bash:
zstd -3 file

Один из разумных вариантов по умолчанию.

Можно использовать более высокий уровень:

Bash:
zstd -10 file

или:

Bash:
zstd -19 file

На высоких уровнях компрессор тратит значительно больше процессорного времени, пытаясь уменьшить размер файла.

У ZSTD существуют даже уровни:

Код:
--ultra -20
--ultra -21
--ultra -22

Но использовать максимальный уровень далеко не всегда имеет смысл.

Разница в размере может составлять лишь несколько процентов, а время сжатия увеличиться во много раз.

---

# TAR.ZST

Для каталогов ZSTD обычно используется вместе с TAR.

Получается:

Код:
.tar.zst

Создание архива:

Bash:
tar -cf - /var/www | zstd -T0 -3 -o backup.tar.zst

Распаковка:

Bash:
zstd -dc backup.tar.zst | tar -xf -
---

# Преимущества tar.zst

## Очень высокая скорость распаковки

Это одно из главных преимуществ ZSTD.

Для серверных задач скорость восстановления резервной копии иногда важнее, чем скорость её создания.

Например, если имеется архив:

Код:
backup.tar.gz

размером несколько десятков гигабайт, его распаковка может заметно нагружать процессор.

Эквивалентный:

Код:
backup.tar.zst

зачастую распаковывается существенно быстрее.

---

## Хорошая степень сжатия

На разумных уровнях ZSTD способен одновременно обеспечивать:

  • высокую скорость;
  • хорошее сжатие;
  • очень быструю декомпрессию.

Поэтому сегодня использование GZIP не всегда является оптимальным выбором.

---

## Хорошо подходит для серверных резервных копий

Например:

Bash:
tar --zstd -cf backup.tar.zst /var/www/

Такой вариант хорошо подходит для:

  • резервных копий сайтов;
  • исходного кода;
  • файлов проектов;
  • логов;
  • файловых хранилищ.

---

## Многопоточное сжатие

ZSTD умеет использовать несколько потоков.

Например:

Bash:
zstd -T0 file

-T0 означает использование всех доступных процессорных ядер.

Для TAR можно использовать конвейер:

Bash:
tar -cf - directory/ | zstd -T0 -3 -o backup.tar.zst

Здесь:

Код:
tar

создаёт поток данных, а:

Код:
zstd

сжимает его с использованием нескольких CPU.

На многоядерных серверах это может дать очень большую прибавку скорости.

---

# Минусы ZSTD

## Совместимость хуже ZIP и GZIP

На современных Linux-системах с ZSTD обычно никаких проблем нет.

Но на старых системах программа:

Bash:
zstd

может отсутствовать.

Например, вместо обычного:

Bash:
tar -xzf backup.tar.gz

может потребоваться предварительно установить пакет:

Bash:
apt install zstd

или:

Bash:
dnf install zstd

Для серверной среды это обычно не проблема, но при отправке архива обычному пользователю ZIP гораздо удобнее.

---

## .zst — не обязательно архив

Это частая ошибка.

Файл:

Код:
backup.zst

обычно представляет собой один сжатый поток.

Если нужно сохранить:

Код:
folder/
    image.jpg
    config.ini
    database.sql

правильнее сделать:

Код:
backup.tar.zst

То есть:

Код:
TAR -> ZSTD

---

# ZIP против TAR.GZ против TAR.ZST

Если сильно упростить сравнение, получится примерно следующая картина:

ХарактеристикаZIPTAR.GZTAR.ZST
СовместимостьОтличнаяОтличнаяХорошая
LinuxХорошоОтличноОтлично
Windows без дополнительного ПООтличноСреднеХуже
Скорость сжатияСредняяСредняя/низкаяВысокая
Скорость распаковкиСредняяСредняяОчень высокая
Степень сжатияСредняяХорошаяХорошая/очень хорошая
МногопоточностьЗависит от реализацииОбычно нетДа
Сохранение Unix-метаданныхОграниченноОтличноОтлично
Извлечение отдельных файловУдобноМенее удобноМенее удобно
Большие серверные архивыСреднеХорошоОтлично
Передача обычному пользователюОтличноХорошоСредне

Краткий итог

Если сформулировать максимально просто:

ZIP

максимальная совместимость

TAR.GZ


классический универсальный Linux-вариант

TAR.ZST


современный быстрый вариант для Linux и серверов

Для отправки небольшого архива пользователю я бы выбрал:


.zip

Для распространения исходников с максимальной совместимостью:

.tar.gz

Для резервного копирования десятков или сотен гигабайт на современных серверах:

.tar.zst

Именно tar.zst сейчас выглядит особенно привлекательно там, где важны скорость создания и, в особенности, скорость восстановления больших архивов.
 
Назад
Верх Низ