Я запускаю эту команду:
pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
Это занимает слишком много времени. Я смотрю на процессы с top
. Процесс bzip2 занимает около 95% и занимает 5% одного ядра. wa
Запись низка. Это означает, что диск не является узким местом.
Что я могу сделать, чтобы увеличить производительность?
Возможно, пусть bzip2 использует больше ядер. Сервер имеет 16 ядер.
Или использовать альтернативу bzip2?
Что я могу сделать, чтобы увеличить производительность?
performance
postgresql
gzip
guettli
источник
источник
Ответы:
Существует множество алгоритмов сжатия, и
bzip2
это один из самых медленных алгоритмов . Равнинаgzip
имеет тенденцию быть значительно быстрее, обычно с не намного худшим сжатием. Когда скорость важнее всего,lzop
моя любимая. Плохое сжатие, но о, так быстро.Я решил немного повеселиться и сравнить несколько алгоритмов, включая их параллельные реализации. Входной файл - это вывод
pg_dumpall
команды на моей рабочей станции, файл SQL размером 1913 МБ. Аппаратное обеспечение - старый четырехъядерный процессор i5. Время настенное время просто сжатия. Параллельные реализации настроены на использование всех 4 ядер. Таблица отсортирована по скорости сжатия.Если 16 ядер вашего сервера достаточно простаивают, чтобы все их можно было использовать для сжатия,
pbzip2
это, вероятно, даст вам очень значительное ускорение. Но вам нужна еще большая скорость, и вы можете терпеть файлы размером ~ 20%,gzip
это, вероятно, ваш лучший выбор.Обновление: я добавил
brotli
(см. Ответ TOOGAMs) результаты в таблицу.brotli
Настройка качества сжатия с имеет очень большое влияние на степень сжатия и скорости, так что я добавил три параметра (q0
,q1
иq11
). По умолчаниюq11
, но это очень медленно, и все еще хуже, чемxz
.q1
выглядит очень хорошо, хотя; такой же коэффициент сжатия, какgzip
и в 4-5 раз быстрее!Обновление: добавлено
lbzip2
(см. Комментарий gmathts) иzstd
(комментарий Джонни) к таблице и отсортировано по скорости сжатия.lbzip2
ставитbzip2
семью обратно в управлении за счет сжатия в три раза быстрее, чемpbzip2
с большим коэффициентом сжатия!zstd
также выглядит разумно, но побежден иbrotli (q1)
в соотношении и в скорости.Мой первоначальный вывод о
gzip
том, что лучшим вариантом является равнина, начинает выглядеть почти глупо. Хотя для повсеместности, это все еще не может быть разбито;)источник
pg_dumpall
выходной), так что он, вероятно, немного более представительный :)lz4
немного быстрее и эффективнее, чемlzop
, кстати. Он использует больше оперативной памяти, что актуально для встроенных систем.zstd -T4
тоже. Для очень быстрых настроек вы можете попробоватьzstd -T4 -1
, поzstd
умолчанию-3
, это, вероятно, настройка, которую вы тестировали.Используйте pbzip2.
В руководстве сказано:
Он автоматически определяет количество имеющихся у вас процессоров и соответственно создает потоки.
источник
pixz
иpigz
к каналу.lbzip2
кажется, дает лучшую скорость, использование памяти и немного лучшее сжатие, чемpbzip2
. Есть тесты здесь: vbtechsupport.com/1614lbzip2
выглядит красиво! Я добавил это в свой ответ :)Некоторые данные:
Сравнение алгоритмов сжатия Brotli, Deflate, Zopfli, LZMA, LZHAM и Bzip2
CanIUse.com: функция: brotli показывает поддержку Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (но не Opera Mini или Microsoft Internet Explorer).
Сравнение: Бротли против дефлята против Зопфли против Лзмы против Лжама против Бзип2
-
Если вы ищете скорость сжатия, то, что вы ищете, это то, какие линии расположены прямо на этом графике. (Записи в верхней части этой диаграммы показывают жесткую степень сжатия. Более высокая = более узкая. Однако, если скорость сжатия является вашим приоритетом, вам следует уделить больше внимания тому, какие линии достигают дальше прямо на диаграмме.)
Сравнение: коэффициент сжатия и скорость сжатия для 7-Zip стандартных методовВы не упомянули операционную систему. Если Windows, 7-Zip с ZStandard (Releases) - это версия 7-Zip, которая была модифицирована для обеспечения поддержки использования всех этих алгоритмов.
источник
brotli
раньше, но я забыл об этом. Я добавил это в таблицу тестов в своем ответе! На самом деле я был немного разочарован его производительностью, за исключением настройки качества 1, где она обеспечивала ту же степень сжатия, что иgzip
на гораздо более высокой скорости.Используйте ZSTD . Если это достаточно хорошо для Facebook, то, вероятно, достаточно хорошо и для вас.
На более серьезной ноте, это на самом деле довольно хорошо . Сейчас я использую его для всего, потому что он просто работает, и он позволяет вам обменять скорость на коэффициент в большом масштабе (чаще всего скорость в любом случае важнее размера, поскольку хранилище дешево, но скорость является узким местом).
На уровнях сжатия, которые достигают сравнимого общего сжатия, как bzip2, это значительно быстрее, и если вы готовы платить больше за процессорное время, вы можете почти достичь результатов, аналогичных LZMA (хотя тогда это будет медленнее, чем bzip2). При чуть худших коэффициентах сжатия он намного, намного быстрее, чем bzip2 или любая другая основная альтернатива.
Теперь вы сжимаете дамп SQL, который настолько смущает, насколько это возможно. Даже самые плохие компрессоры хорошо зарекомендовали себя на таких данных.
Таким образом, вы можете работать
zstd
с более низким уровнем сжатия, который будет работать в десятки раз быстрее и при этом достигнет 95-99% такого же сжатия этих данных.В качестве бонуса, если вы будете делать это часто и хотите потратить дополнительное время, вы можете
zstd
заранее «тренировать» компрессор, что увеличивает как степень сжатия, так и скорость. Обратите внимание, что для того, чтобы тренировка работала хорошо, вам нужно кормить ее отдельными записями, а не целыми. Как работает этот инструмент, он ожидает много маленьких и несколько похожих образцов для обучения, а не один большой шарик.источник
Похоже, что настройка (уменьшение) размера блока может оказать существенное влияние на время сжатия.
Вот некоторые результаты эксперимента, который я провел на моей машине. Я использовал
time
команду для измерения времени выполнения.input.txt
текстовый файл ~ 250 Мб, содержащий произвольные записи jsonИспользуя размер блока по умолчанию (самый большой) (
--best
просто выбирает поведение по умолчанию):Используя наименьший размер блока (
--fast
аргумент):Это было немного удивительное открытие, учитывая, что документация говорит:
источник