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


41

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

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


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.


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 /

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) не будут затронуты этим.
Кристиан Худон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.