Использование многоядерного ядра для сжатия/декомпрессии 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
Наконец-то.