Использование многоядерного ядра для сжатия/декомпрессии tar + gzip/bzip

Я обычно сжимаю с помощью tar zcvf и распаковываю с помощью tar zxvf (используя gzip из-за привычки).

Недавно я получил четырехъядерный процессор с гиперпотоком, поэтому у меня есть 8 логических ядер, и я замечаю, что многие из ядер не используются во время сжатия/декомпрессии.

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

Ответ 1

Вы можете использовать pigz вместо gzip, что делает сжатие gzip на нескольких ядрах. Вместо использования опции -z вы можете пропустить ее через pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

По умолчанию, pigz использует количество доступных ядер, или восемь, если он не может запросить это. Вы можете запросить больше с помощью -p n, например. -p 32. У pigz есть такие же опции, как gzip, поэтому вы можете запросить лучшее сжатие с -9. Например.

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

Ответ 2

Вы также можете использовать флаг tar "--use-compress-program =", чтобы сообщить tar, какую программу сжатия использовать.

Например, используйте:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

Ответ 3

Общий подход

Существует опция для программы tar:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Вы можете использовать многопоточную версию утилиты архивирования или компрессора.

Самые популярные многопоточные архиваторы pigz (вместо gzip) и pbzip2 (вместо этого of bzip2). Например:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Архиватор должен принять -d. Если ваша утилита замены не имеет этого параметра и/или вам нужно указать дополнительные параметры, тогда используйте каналы (при необходимости добавьте параметры):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

Входы и выходы singlethread и multithread совместимы. Вы можете сжимать с помощью многопоточной версии и распаковывать с помощью однострочной версии и наоборот.

p7zip

Для p7zip для сжатия вам понадобится небольшая оболочка script, как показано ниже:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

Сохраните его как 7zhelper.sh. Вот пример использования:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

XZ

Относительно многопоточной поддержки XZ. Если вы используете версию 5.2.0 или выше XZ Utils, вы можете установить "-T" или "-threads" в соответствующее значение через переменную окружения XZ_DEFAULTS (например, XZ_DEFAULTS = "- T 0" ). Это фрагмент человека для версии 5.1.0alpha:

Многопотоковое сжатие и декомпрессия еще не реализованы, поэтому это вариант не действует сейчас.

Перекомпиляция с заменой

Если вы создаете tar из источников, вы можете перекомпилировать с параметрами

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

После повторной компиляции tar с этими параметрами вы можете проверить вывод справки tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

Ответ 4

Вы можете использовать переключатель -I для tar --use-compress-program и вызвать pbzip2 для сжатия bzip2 на нескольких ядрах:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

Ответ 5

Если вы хотите иметь большую гибкость с именами файлов и параметрами сжатия, вы можете использовать:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='[email protected]/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Шаг 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

Эта команда будет искать файлы, которые вы хотите архивировать, в этом случае /my/path/*.sql и /my/path/*.log. Добавьте как можно больше -o -name "pattern".

-exec выполнит следующую команду, используя результаты find: tar

Шаг 2: tar

tar -P --transform='[email protected]/my/path/@@g' -cf - {} +

--transform - простой параметр замены строки. Он удалит путь к файлам из архива, поэтому при извлечении корневого файла tarball станет текущим каталогом. Обратите внимание, что вы не можете использовать параметр -C для изменения каталога, поскольку вы потеряете преимущества find: все файлы каталога будут включены.

-P сообщает tar использовать абсолютные пути, поэтому он не вызывает предупреждение "Удаление ведущих//из имен членов". Ведущий '/' с удалением --transform в любом случае.

-cf - сообщает tar использовать имя tarball, которое мы укажем позже

{} + использует все файлы, найденные ранее find

Шаг 3: pigz

pigz -9 -p 4

Используйте столько параметров, сколько хотите. В этом случае -9 - уровень сжатия, а -p 4 - количество ядер, предназначенных для сжатия. Если вы запускаете это на тяжело загружаемом веб-сервере, вы, вероятно, не хотите использовать все доступные ядра.

Шаг 4: имя архива

> myarchive.tar.gz

Наконец-то.