Как лучше всего использовать параллельные bzip2 и gzip по умолчанию?

41

Bzip2 и gzip используют только одно ядро, хотя многие компьютеры имеют более одного ядра. Но есть такие программы, как lbzip2, pbzip2 и pigz, которые используют все доступные ядра и обещают быть совместимыми с bzip2 и gzip.

Итак, как лучше всего использовать эти программы по умолчанию, чтобы tar cfa file.tar.bz2 directoryвместо bzip2 использовать lbzip2 / pbzip2? Конечно, я не хочу ничего ломать.

elmicha
источник
2
Из любопытства: действительно ли параллельный gzip / bzip быстрее последовательного? Я хотел бы представить, что скорость записи жесткого диска и другие ограничения являются большей проблемой.
con-f-use
@ con-f-use Нет, если теоретически у вас нет твердотельных накопителей, это может быть быстрее при увеличении общего размера архива.
Марко Чеппи
1
В системе с 16 процессорами при переходе с gzip на pigz время сокращается до 1.2 ТБ и передается по сети, а результат теста составляет от 18 часов резервного копирования и 14 часов тестирования до 4 часов резервного копирования и 2 часов тестирования. Существует множество потенциальных узких мест, скорость диска, скорость сети, вычислительная мощность, однако в этом случае это определенно было связано с ЦП больше, чем с IO. Это система высокого класса, ваши результаты могут отличаться. Не то, чтобы это имело значение, но это было на RHEL6
cs_alumnus

Ответы:

32

Вы можете использовать символические ссылки bzip2, bunzip2 и bzcat на lbzip2, а gzip, gunzip, gzcat и zcat на pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

Я выбрал lbzip2 вместо pbzip2, потому что /usr/share/doc/lbzip2/README.gz выглядит «лучше», чем /usr/share/doc/pbzip2/README.gz. Также в руководстве по tar рассказывается о lbzip2 .

Редактировать:

pigz-2.1.6, входящий в состав Precise Pangolin, отказывается распаковывать файлы с неизвестными суффиксами (например, initramfs - *. img). Это исправлено в pigz-2.2.4, который поставляется с Quantal. Так что вы можете подождать, пока Quantal, установить пакет Quantal вручную или пока не связывать gunzip / gzcat / zcat.

elmicha
источник
7
Это хорошо работает, потому что / usr / local / bin / стоит перед / bin / в $ PATH большинства людей. Если что-то вызывает / bin / gunzip напрямую или кто-то первым имеет / bin в $ PATH, они не будут использовать pigz. Чтобы сделать это для них также, вы можете использовать dpk-divert и сделать что-то подобное для всех двоичных файлов, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipно есть вероятность, что pigz не на 100% совместим со всеми флагами gzip, поэтому будьте осторожны.
Марк Маккинстри
31

Идея символической ссылки действительно хороша.
Другое рабочее решение для псевдонима tar:

alias tar='tar --use-compress-program=pbzip2'

или соответственно

alias tar='tar --use-compress-program=pigz'

Это создает другой вид дефолта.

Бастиан Эбелинг
источник
дополнительное преимущество: вы можете использовать псевдоним наподобие 'partar', если вы хотите сохранить первоначальную функциональность (по какой-то причине) .. к сожалению, 'ptar' используется реализацией perl
jena
13

Символическая ссылка действительно неверна. Он заменит gzip по умолчанию (или bzip2) на pigz (или pbzip2) для всей системы. Хотя параллельные реализации удивительно похожи на версии с одним процессом, тонкие различия в параметрах командной строки могут нарушить основные системные процессы, которые зависят от этих различий.

Опция --use-compress-program - намного лучший выбор. Второй вариант (очень похожий на псевдоним) - установить переменную окружения TAR_OPTIONS, поддерживаемую GNU tar:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
user154053
источник
6
Я использую символические ссылки с 2011 года и не вижу поломок (кроме случая, упомянутого в редактировании). И если такие тонкие различия не будут обнаружены и сообщены, мы будем зависеть от непараллельных версий навсегда. Если вы используете TAR_OPTIONS = "- use-compress-program = pbzip2", то не похоже, что вы можете различить bzip2 и gzip.
elmicha
Это не сработало для меня.
Дерек Перкинс
3

Одним из интересных вариантов является перекомпиляция tar для использования многопоточных по умолчанию. Скопировано из этого ответа stackoverflow

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

Если вы собираете 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
Том Кох
источник
-2

Используйте в вашем ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
фу бар
источник
1
Это будет работать только при вызове gzip(или gunzip) программы непосредственно из командной строки оболочки. Другие программы (вроде tar) не будут затронуты этим.
Кристиан Худон