bzip, gzip или pigz?

Навеяно статьёй "Ускорение резервирования базы данных"  из журнала "Системный администратор" за декабрь 2012 год #12(121).

Основной смысл статьи был в том что бы не сохранять предварительные данные из mysqldump в файл который будет сжиматься, а сразу сжимать поток и записывать его на диск. Я сразу заинтересовался этой статьёй, т.к. у меня на сервере то же существует так скажем лишняя нагрузка которая меня нервирует.

У себя я использую bzip2 т.к. он лучше сжимает файл, но как результат у меня бекап снимается за 13m18.770s то есть всё выгляло изначально примерно так:

mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick ${work_dir}/mysql/db_name.sql
bzip2 -9 ${work_dir}/mysql/db_name.sql
#13m18.770s

Я решил поменять это метод сжатия на gzip и избавиться от промежуточного файла

mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick | gzip > ${work_dir}/mysql/$db_name.sql.gz
#1m46.244s

Заметное сокращение по времени! Но я решил попробовать использовать pigz - он использует при сжатие несколько потоков что сокращает время создания бекапа:

mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick | pigz > ${work_dir}/mysql/$db_name.sql.gz
#1m21.159s

Разница не большая но есть. В итоге что я получаю: при смене алгоритма сжатия размер дампа увеличился на четверть (с 400МБ до 500 МБ), а скорость создания уменьшилась в 10 раз. Учитывая что размер дисков мне позволяет хранить ежедневные дампы за несколько лет, то я решил что увеличение размера дампа это не большая потеря по сравнению с выйгрышем во времени. А вот что касается использования pigz вместо gzip то тут я решил что это лишнее, т.к. увеличение скорости слишком маленькое, а в результате вместо одного занятого ядра у меня получается два занятых ядра. В итоге я оставил gzip.

Автор: Сергей Степанов

Поделиться @
Иван, 2 июня 2016 в 22:08
А bzip2 так использовать нельзя? Как минимум наверняка можно передать файл через конвеер (pipe, пайп, канал, вертикальную черту) типа:
mysqldump | bzip2 filename.bz2
Текстовые потоки это unix-way, поэтому большинство программ под unix-подобные ОС с ними работают. Тем более консольные.
Тут надо разобраться на что имено уходило так много времени. Думаю даже если записать файл на диск два раза, то время в 13 раз не вырастет. Даже если его ещё раз и удалить, если это не SSD. Значит время уходило на сжатие. Возможно если убрать -9, то и первый вариант будет работать быстрей, т. к. это параметр сжатия и он не умолчальный. А если оно нужно, то gzip и наверное pigz тоже их поддерживают. И тогда надо посмотреть, будет ли отрыв по времени в 13 раз.
Предварительное сохранение тоже может иметь плюс. Если сжатие длится долго, то подозреваю mysqldump не закончится и не разлочит таблицы базы, пока не завершится сжатие. Т. е. база данных будет недоступна для программ, как минимум на запись. Если это важно, то надо проверять что происходит быстрее - запись в большой несжатый файл или сжатие с записью маленького сжатого.
Если же отказ от bzip2 вызван только желанием использовать текстовый поток без сохранения промежуточного файла, то gzip и наверное pigz тоже умеют так работать. Т. е. не понятна суть статьи, что-на что меняем и для чего.
Иван, 2 июня 2016 в 22:11
Забыл. А чем плохо когда загружены оба ядра? Мне кажется наоборот нагрузка распределяется более равномерно. Загружены же они на половину?