Открытие костыльного цеха
Привет. Все бэкапы, как и полагается, я сжимаю через tar + gzip. Ну повелось так. Можно сказать, это устоявшийся стандарт.
Но моя ебанца покоя не даёт, вот и в этот раз сижу, думаю: а хули так долго всё сжимается? У меня 32 ядра на сервере с репликой, диск не самый плохой. А оно еле ворочается.
Пошёл ковырять кишочки, оказывается, у меня gzip хуярит на одном ядре. Не понял. Так и есть. Говорят, что с версии 1.7 всё изменилось и оно само подстраивается под железо. НИХУЯ, у меня 1.10. Из коробки работает одно ядро.
Хм, может, для gzip есть какой-то ключ? Бегло пробежался, в хелпах про threads ничего нет.
Ну раз так. Расчехляем свиней. PIGZ!
PIGZ (Parallel Implementation of GZIP) — это утилита для сжатия файлов, которая использует параллельные вычисления для ускорения процесса сжатия данных.
Ставится из репы: apt install pigz, а где-то уже сразу установлена.
Давай затестим. Создаём 10-гигабайтный файл.
truncate -s 10G bashdays
Запускаем тесты:
time gzip -k -c bashdays > /dev/null
real 0m46.590s
time pigz -k -c bashdays > /dev/null
real 0m8.535s
Понятно, тесты синтетические, но мне их достаточно.
Ради интереса открыл htop, всё верно. gzip усирается на одном ядрышке. А «свиньи» сразу жрут всё с костями. Прекрасно!
Теперь pigz нужно подружить с tar
С этим всё просто, через pipe:
tar cf - bashdays | pigz -k -c > bashdays.tar.gz
Либо, как вариант, через ключ --use-compress-program:
tar --use-compress-program="pigz --best --recursive" -cf bashdays.tar.gz bashdays
Но мне первый больше нравится. А чтобы видеть прогресс, можешь запустить так:
tar cf - bashdays | pigz -k -c | pv > bashdays.tar.gz
Тут используется утилита pv, про неё писал в этом посте.
Например, можешь сказать ей, чтобы использовала только два ядра и два потока. Почитай хелпину, если интересно. Основное я тебе рассказал. Изучай.
Увидимся! Пойду адаптировать под свои бэкапы.








Комментарии