Как заставить tar использовать все ядра при сжатии в Linux

Если вы когда‑либо сжимали большие объёмы с помощью tar, вы знаете, как медленно это может идти при однопоточном сжатии. Часто процесс занимает много минут или часов, и вы прерываете его. К счастью, существуют «параллельные» реализации gzip, bzip2 и xz — pigz, pbzip2 и pxz — которые позволяют tar эффективно использовать все доступные ядра CPU и ускорять создание архивов. В этой статье показано, как это сделать на Linux, с примерами, советами и контрольными списками.
Что нужно знать: обзор инструментов
Основные инструменты:
- pigz — параллельный gzip. Быстрый, даёт меньшую степень сжатия по сравнению с xz.
- pbzip2 — параллельный bzip2. Баланс между скоростью и степенью сжатия.
- pxz — параллельный xz. Наилучшее сжатие, но требует больше времени и памяти.
Буква “p” в начале имён означает “parallel” — параллельный режим. На современных многопроцессорных системах (от 4‑8 до десятков и сотен потоков) эти инструменты дают заметный выигрыш по времени.
Установка
Установите нужные пакеты из репозиториев вашей системы. Примеры команд для популярных дистрибутивов:
sudo apt install pigz pbzip2 pxz # Debian/Ubuntu
sudo dnf install pigz pbzip2 pxz # Fedora
sudo pacman -Sy pigz pbzip2 pxz # Arch Linux
Совет: на сервере с ограниченной RAM сначала протестируйте pxz с небольшими параметрами, чтобы не вызвать OOM при агрессивных настройках сжатия.
Базовый синтаксис tar с обычным сжатием
Обычные однопоточные команды tar выглядят так:
tar czf linux-5.10-rc3.tar.gz linux/
tar cjf linux-5.10-rc3.tar.bz2 linux/
tar cJf linux-5.10-rc3.tar.xz linux/c — create, z — gzip, j — bzip2, J — xz, f — файл. Эти команды используют стандартные одноядерные реализации: gzip, bzip2, xz.
На моей тестовой машине (старый i7‑2600s) сжатие ядра Linux заняло около 28 минут с xz в однопоточном режиме.

Как заставить tar использовать параллельные компрессоры
Tar может передать поток данных внешней программе сжатия. Для этого есть две опции:
- короткая: -I <программа>
- полная: –use-compress-program=<программа>
Примеры корректных команд:
tar -I pigz -cf linux-5.10-rc3.tar.gz linux/
tar -I pbzip2 -cf linux-5.10-rc3.tar.bz2 linux/
tar -I pxz -cf linux-5.10-rc3.tar.xz linux/Или эквивалент с длинной опцией:
tar --use-compress-program=pxz -cf linux-5.10-rc3.tar.xz linux/После запуска вы увидите, что pxz/pigz используют все доступные потоки CPU и время сжатия существенно сокращается.

В моём примере с pxz время уменьшилось с ~28 минут до ~7 минут, даже при параллельной работе виртуальной машины и браузера в фоне.

Настройка уровня сжатия
pxz, pigz и pbzip2 поддерживают флаги уровня сжатия (обычно -1…-9). Более высокий уровень = меньше размер архива, но больше времени и памяти.
Пример для pxz:
pxz -T0 -9 < input > output.xz- -T0 — автоматически использовать все доступные потоки
- -9 — максимальный уровень сжатия
С tar:
tar -I 'pxz -T0 -9' -cf linux-5.10-rc3.tar.xz linux/
Важно: агрессивные уровни сжатия значительно увеличивают использование оперативной памяти и время. Если каждый мегабайт важен — это оправдано. В остальных случаях разумнее выбрать средний уровень.

Когда параллельное сжатие не поможет (контрпримеры)
- Большие числа мелких файлов. Параллелизация компрессора полезна для потока данных; если узким местом является сборка большого количества мелких файлов, выигрыш может быть ограничен. В таких случаях сначала упакуйте в tar, затем сжимайте.
- I/O‑ограниченные системы (медленные HDD). Если диск не выдерживает записи, CPU не будет главным ограничителем.
- Нехватка памяти. Агрессивное сжатие с pxz -9 может привести к OOM.
Альтернативные подходы
- rsync + xz/pigz: для передачи и хранения дельт лучше подходит rsync/rdiff.
- zstd (не в этой статье): zstd предлагает отличное соотношение скорости/сжатия и имеет параллельные утилиты (zstdmt). Можно использовать tar -I ‘zstd -T0’.
- split + параллельное сжатие частей: если у вас большая файловая система, можно разделить набор файлов и сжать в нескольких параллельных процессах.
Чек‑лист перед запуском (роль‑ориентированный)
Для системного администратора:
- Установить pigz/pbzip2/pxz и проверить версии.
- Оценить доступную RAM и потоки CPU.
- Тестировать на небольшом наборе данных.
Для разработчика/инженера по данным:
- Протестировать компромисс скорость/размер для вашего типа данных.
- Использовать скрипт автоматизации для повторяемости.
Общий чек‑лист:
- Есть резервная копия на случай ошибки
- Достаточно свободного места на диске
- Проверено потребление памяти при выбранном уровне сжатия
Быстрая памятка: команды и сниппеты (cheat sheet)
Создать .tar.xz с pxz, используя все ядра:
tar -I 'pxz -T0' -cf archive.tar.xz /path/to/dirСоздать .tar.gz с pigz, все ядра, уровень 6:
tar -I 'pigz -p 0 -6' -cf archive.tar.gz /path/to/dirРаспаковать архивы (обычно стандартные tar справится):
tar -xf archive.tar.xzПримечание: некоторые старые версии tar не понимают -I; в таком случае используйте –use-compress-program или вызовите pxz/pigz отдельно.
Критерии приёмки
- Архив успешно создан и распаковывается на целевой системе.
- Время создания архива сократилось по сравнению с однопоточным режимом (или соответствует ожиданию).
- Потребление памяти в пике не превышает допустимого порога.
Мини‑методология для повторяемых бенчмарков
- Выберите один и тот же набор файлов и расположение Диска/FS.
- Очистите кеши диска (для теста на реальную скорость I/O).
- Запустите каждый тест минимум 3 раза и усредните результаты.
- Измеряйте время (time), нагрузку CPU (htop) и итоговый размер архива.
- Документируйте настройки (уровень сжатия, число потоков).
Совместимость и миграция
- pxz создает совместимые xz‑файлы, которые можно распаковать на любой системе с xz.
- При передаче архивов на платформы с ограниченными ресурсами избегайте высоких уровней сжатия.
Короткий глоссарий
- tar — утилита архивирования потоков файлов.
- pigz/pbzip2/pxz — многопоточные реализации gzip/bzip2/xz соответственно.
- -I / –use-compress-program — опция tar для указания внешней программы сжатия.
Важно: параллельное сжатие экономит время, но не всегда снижает нагрузку на систему. Тестируйте в условиях, близких к рабочим.
Резюме
Использование pigz, pbzip2 или pxz через опцию -I в tar — простой и надёжный способ задействовать все CPU‑ядра и ускорить сжатие больших архивов в Linux. Выбор инструмента зависит от желаемого баланса скорости и степени сжатия: pigz — быстрее, pxz — лучше сжимает. Тестируйте уровни сжатия и следите за потреблением памяти.
Если вы хотите быстро начать: установите pxz и выполните tar -I ‘pxz -T0’ -cf archive.tar.xz /path/to/dir. Это даст заметный прирост производительности на современных многоядерных машинах.
Спасибо за прочтение — удачных и быстрых архивов!