Zstandard — новый, быстрый и эффективный алгоритм сжатия данных

Обрабатываемые объемы данных с каждым годом только растут, выдвигая новые и, зачастую, противоречивые требования к информационным системам. В частности? это касается архивации данных, с одной стороны для эффективного использования устройств хранения требуется высокий коэффициент сжатия, с другой стороны важное значение имеет скорость работы. Ранее существовавшие алгоритмы предлагали что-то одно: либо быструю скорость работы, либо отличное сжатие. Zstandard — новый алгоритм, разработанный с учетом современных требований и сегодня мы посмотрим насколько он эффективен.

Некоторое время назад мы проводили тестирование консольных архиваторов, которое показало что наиболее оптимальным является использование архиваторов на основе алгоритма Deflate, к которым относятся ZIP и gzip. Они обеспечивают высокую скорость архивации при неплохой степени сжатия. Их противоположностью являются использующие алгоритм LZMA продукты, самый известный из которых 7Zip, для них характерна отличная степень сжатия, но за это приходится платить низкой скоростью работы.

Постоянно растущие объемы данных не позволяют рассматривать LZMA, как эффективный алгоритм, делая его нишевым решением, когда на первый план выходит именно степень сжатия, а время создания и распаковки архивов не имеют значения. Поэтому при разработке Zstandard была поставлена цель добиться степени сжатия сравнимой с Deflate при более высокой скорости работы. Разработкой занимается Ян Колле (фр. Yann Collet) при поддержке Facebook и ему удалось достигнуть действительно отличных результатов. При использовании стандартной степени сжатия Zstandard сжимает лучше и быстрее Deflate, а на высоких степенях может тягаться с LZMA, но распаковка таких архивов происходит практически также быстро, как и архивов с низкой степенью компрессии.

Эта особенность обусловила переход на Zstandard для сжатия пакетов ведущими дистрибутивами, такими как Ubuntu, Fedora, Arc. Он применяется для сжатия в файловых системах btrfs и OpenZFS, в СУБД MySQL, PostgreSQL, MongoDB, Tarantool. С полным списком применяющих Zstandard проектов можно ознакомиться здесь: facebook.github.io/zstd. Все это заставляет присмотреться к новому алгоритму достаточно внимательно, поэтому мы провели собственное исследование эффективности Zstandard с которым и хотим вас ознакомить.

Тестирование эффективности Zstandard

На этот раз мы не стали устраивать полноценного тестирования, а использовали одну из реальных задач — архивирование дампа базы PostgreSQL объемом около 11 ГБ, а в качестве конкурентов использовали gzip (Deflate) и 7Zip (LZMA). Тестирование производилось в среде Debian 10 с установками сжатия по умолчанию. Для измерения времени использовалась команда time, результат представляет среднее от пяти запусков.

Результат нас очень сильно удивил: zstd сжал 10,8 ГБ за рекордные 35 секунд, за ним следует gzip с результатом в 2 мин 15 секунд, а замыкает список 7zip, которому потребовалось более получаса.

zstd-test-001.pngА как обстоят дела со степенью сжатия? Тоже неплохо: 9% — это немного лучше чем у gzip c его 10,4% и немного хуже 7,9% 7Zip. Но в целом разрыв по степени сжатия не столь велик и отходит на второй план по сравнению с разницей во времени.

zstd-test-002.pngКак можем видеть, LZMA вообще нельзя рассматривать как эффективный алгоритм, полчаса работы — это очень много, учитывая то, что сжатие данных требовательная к процессорным ресурсам операция, тем более что аналогичного результата можно достичь всего за 30 секунд! Да и Deflate тоже пора уступать место новому алгоритму, разрыв на фоне LZMA не так заметен, но все-таки в 4 раза, да и сжимает Zstandard лучше. Но у ZIP и gzip есть большое преимущество — распространенность, данные архиваторы поддерживаются в своих ОС «из коробки», что в некоторых случаях может быть важно.

Еще один важный параметр — время распаковки, здесь разница между архиваторами уже не столь велика: 7Zip тратит на извлечение данных чуть больше минуты, gzip и zstd справляются за 30 секунд, разница между ними в погрешности измерений, но мы помним, что zstd сжимает лучше.

zstd-test-003.pngА теперь сделаем несложные вычисления и подумаем. Zstandard распаковал и записал на диск 10,8 ГБ за 32 секунды, скорость копирования при этом составила около 360 МБ/с, что составляет практически верхнюю планку для нашего массива RAID 10 на котором расположена данная виртуальная машина. Может ли производительность дисковой подсистемы оказаться узким местом для архиватора? Вполне, причем не только при распаковке, но и при сжатии, так как данные с диска нужно прочитать, а с учетом результатов zstd мы получаем примерно такую же скорость обмена данными, близкую к физическим ограничениям подсистемы. Поэтому мы подключили к виртуальной машине еще один диск, расположенный на производительном NVMe SSD ADATA XPG SX8200 Pro и повторили тесты на нем.

Если классические алгоритмы не получили никакой выгоды от смены носителя, то для Zstandard эффект был получен незамедлительно, время сжатия дампа уменьшилось с 35 до 22 секунд, а это около 37%, что очень и очень неплохо.

zstd-test-004.pngС распаковкой картина аналогичная: Deflate и LZMA снова никак не отреагировали на смену носителя, а zstd обновил результаты, распаковав архив за 19 секунд и уверенно обозначил лидерство.

zstd-test-005.pngДаже столь небольшое тестирование дает понять, что перед нами очень эффективный алгоритм сжатия нового поколения, а стоящая за его разработкой компания Facebook, как раз работающая с большими объемами данных, обещает хорошие перспективы для дальнейшего развития.

Как начать пользоваться Zstandard

Следующий вопрос, который возникнет у наших читателей, как получить и начать использовать Zstandard? Для пользователей Linux все очень просто, zstd входит в репозитории и установить его можно простой командой (для DEB-based дистрибутивов):

apt install zstd

Для получения краткой справки наберите:

zstd -h 

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

zstd -H

zstd-test-006.pngСжать файл можно командой:

zstd filename

После чего будет создан архив с именем filename.zst, если требуется указать иное имя файла архива воспользуйтесь дополнительным ключом:

zstd filename -o archive.zstd

Для распаковки воспользуйтесь:

zstd -d filename.zst

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

tar --zst -cf myfolder.tar.zst myfolder

Для распаковки такого архива выполните:

tar --zst -xf myfolder.tar.zst

Пользователи Windows тоже могут использовать Zstandard, для этого нужно скачать архив с официальной страницы разработчиков на Github. Из всего содержимого архива вам понадобится один единственный файл — zstd.exe, синтаксис команд и возможности полностью совпадают с Linux-версией.

7zip с поддержкой Zstandard

zstd-v1.5.0-win32

zstd-v1.5.0-win64

7z21.02-zstd-x64.exe

7z21.02-zstd-x32.exe

7z19.00-zstd-x32.exe

interface31.ru