Pull to refresh

Почти линейное увеличение производительности bzip2 на многопроцессорных системах

Reading time 2 min
Views 17K
В Linux часто используется сжатие с помощью gzip и bzip2. Они оба обеспечивают хорошую плотность сжатия, и удобны в использовании. При этом bzip2 сжимает большинство файлов эффективнее — но, с другой стороны, работает медленнее, чем более традиционные gzip или zip.

Но можно получить эффективность bzip2, при этом существенно увеличив скорость. Речь идёт об утилите pbzip2 — Parallel BZIP2. В обычном случае при использовании bzip2 задействуется только одно процессорное ядро, в то время как на современных системах их может быть 2, 4, или, например, 8.

Pbzip2 может использовать сразу несколько процессорных ядер, что приводит, по заявлению авторов, к почти линейному увеличению производительности. Сжатые файлы, которые создаёт pbzip2, полностью совместимы с bzip2 1.0.2 и более новыми версиями bzip2 (также есть утилита pigz, которая, в свою очередь, является многопоточной реализацией gzip — спасибо altexxx).

Ниже результат тестирования скорости сжатия участка SQL-файла размером 1000M (dd if=dump.sql of=testfile bs=1M count=1000) на компьютере с двумя процессорами Intel Xeon E5520 (4 ядра, 8 потоков, тактовая частота 2,26 ГГц):

Результаты тестирования

Как видно из результатов тестирования, pbzip2, работающий в 4 потока, приблизительно в 3,6 раз быстрее, чем bzip2, работающий в один поток — что действительно является почти линейным увеличением производительности.

При этом pbzip2, работающий в 16 потоков, оказался медленнее, чем pbzip2, использующий 4 потока — вероятно, из-за скорости выполнения операций ввода/вывода. Также смотрите дополнительные тесты в комментариях (спасибо tristan и bliznezz) — в том числе, с использованием tmpfs-раздела в оперативной памяти.

Используется pbzip2 примерно так же, как и просто bzip2, но есть некоторые дополнительные функции, например вывод прогресса выполнения операции в процентах.


Чтобы сжать файл:
pbzip2 -k -p4 filename

Где filename — имя файла. По умолчанию сжатый файл называется так же, как исходник, но в конце добавляется .bz2 (то есть в данном случае filename.bz2).

Опция -k нужна для того, чтобы pbzip2 не удалял исходник после того, как закончит сжатие. Можно также добавить опцию -v, для того, чтобы выводилась подробная информация, в том числе прогресс выполнения операции в процентах.

Опция -p устанавливает количество потоков (в данном случае 4).

Чтобы распаковать файл:
pbzip2 -dk -p4 filename.bz2

Где filename.bz2 — имя файла. По умолчанию распакованный файл называется так же, как сжатый, но в конце убирается .bz2 (то есть в данном случае filename).

Опция -d нужна для того, чтобы произвести декомпрессию (decompress).

Соответственно, вместе с выводом подробной информации и прогресса выполнения операции сжатие будет выглядеть так:
pbzip2 -kv -p4 filename

А распаковать файл можно так:
pbzip2 -dkv -p4 filename.bz2

Если требуется сжать целую директорию, то, как и в случае с gzip и bzip2, делается так называемый тарболл (который сам по себе не имеет сжатия), содержащий нужную директорию, и он сжимается нужной утилитой.

В случае с pbzip2 сделать это в одну строку можно так:
tar cf myfile.tar.bz2 --use-compress-prog=pbzip2 directory_to_compress/

Или так:
tar -c directory_to_compress/ | pbzip2 -c > myfile.tar.bz2

Во втором случае, соответственно, можно также добавить -p4 (чтобы установить количество потоков, равное 4).
Tags:
Hubs:
+44
Comments 17
Comments Comments 17

Articles