Как оптимально заархивировать файлы, чтобы распаковать их средствами ISPmanager? оптимально значит, что уже достаточно быстро, но еще приемлемо плотно
В определенных случаях файлы выгоднее заливать на веб-сервер в виде архива. Во-первых, если данные хорошо сжимаются, или же просто файлов очень много, это сократит время заливки. Во-вторых, в любом случае это обезопасит данные от случайного повреждения, так как при распаковке архива происходит проверка его целостности с помощью контрольной суммы (CRC). Однако, не вполне понятно, какой формат архива и тип сжатия выбирать? Мы провели небольшое экспериментальное исследование на эту тему.
На входе у нас были файлы базы данных MySQL: DATABASE.MYD (17.9 GB) и DATABASE.MYI (2.48 GB). MYD-файл содержит текстовые данные базы, которые сжимаются неплохо. В MYI-файле находится индекс, гораздо менее склонный к циклическим повторениям, а от того сжимающийся хуже. Как известно, 7-Zip это один из лучших архиваторов, и в режиме «Ультра» он сжал эти файлы следующим образом:
- DATABASE.MYD_(7z-Ultra).7z = 1.84 ГБ. (10,29% оригинала)
- DATABASE.MYI_(7z-Ultra).7z = 0.89 ГБ. (36,03%)
Однако, формат 7z по-умолчанию не поддерживается ни в CentOS, ни тем более в ISPmanager, поэтому информация приведена просто для справки. Нашей задачей было найти тот тип архива, который можно распаковать прямо из Менеджера Файлов, нажав кнопку "Извлечь":
Самый очевидный тип архива, который наверняка поддерживается почти всем вокруг, это классический ZIP. Он поддерживается и панелью ISPmanager, а чтобы создать такой архив под Windows мы будем использовать 7-zip (16.04, x64):
Как видите, 7-zip предлагает несколько вариантов компрессии: Deflate, Deflate64, BZip2, LZMA, PPMd. Сразу скажем, что алгоритмы LZMA и PPMd не поддерживаются в ISPmanager и при попытке их распаковать возникнет ошибка. Алгоритм Deflate дефолтный и самый старый, и мы даже не стали проверять, как он работает, зная, что относительно плохо. Deflate64 при «Нормальном» уровне сжатия показал следующий результат:
- DATABASE.MYD_(Def64-Norm).zip = 3.16 ГБ. (17,67%)
- DATABASE.MYI_(Def64-Norm).zip = 1.27 ГБ. (51,80%)
Мы попробовали использовать уровень сжатия «Максимальный» и «Ультра», но тут возникли проблемы. Несмотря на выбор 8 потоков, два наших 4 ядерных XEON'а загружались всего на 10-15%, а весь процесс сжатия, изначально оценивавшийся в 3 часа, через 6 часов оценивался уже в 12-13 часов. Что-то долговато!
Следующий алгоритм, BZip2 работает не в пример быстрее, и -- ура! -- поддерживается в ISPmanager по крайней мере 5-й версии. Алгоритм отлично распараллеливается и плотно грузит все 8 ядер системы, таким образом мы сфокусировались на нем и получили следующие результаты:
- Уровень сжатия «Ультра», время сжатия 116 минут на оба файла:
- DATABASE.MYD_(BZip2-Ultra).zip = 2.33 ГБ. (13,07651%)
- DATABASE.MYI_(BZip2-Ultra).zip = 1.17 ГБ. (47,52%)
- Уровень сжатия «Максимум», время сжатия 42 минуты на оба файла:
- DATABASE.MYD_(BZip2-Max).zip = 2.33 ГБ. (13,07654%)
- DATABASE.MYI_(BZip2-Max).zip = 1.27 ГБ. (51,51%) заметьте, результат похож на Deflate64, но скорость сжатия выше в 1.5-2 раза
- Уровень сжатия «Нормальный», время сжатия 25 минут на оба файла :
- DATABASE.MYD_(BZip2-Norm).zip = 2.33 ГБ. (13,07710%)
- DATABASE.MYI_(BZip2-Norm).zip = 1.29 ГБ. (52,34%)
- Уровень сжатия «Быстрый», время сжатия 13 минут на оба файла:
- DATABASE.MYD_(BZip2-Fast).zip = 3.62 ГБ. (20,26%)
- DATABASE.MYI_(BZip2-Fast).zip = 1.48 ГБ. (59,90%)
Легко можно сделать следующие выводы:
- BZip2 -- оптимальный алгоритм компрессии для ZIP, совместимый с ISPmanager и CentOS. Он сжимает в целом лучше дефолтных Deflate и Deflate64, но, конечно, уступая 7z с его LZMA2. Алгоритм отлично поддерживает многопоточность, и, возможно, только за счет этого выигрывает по скорости у Deflate64.
- Уровни сжатия «Максимум» и«Ультра» дают незначительный выигрыш в сжатии по сравнению с «Нормальным», не оправдываемый временными затратами. Особенно это проявляется при сжатии хорошо сжимаемых данных -- почти никакого толка в сильном сжатии нет.
- А вот уровень «Быстрый», при экономии времени в 2 раза (которое составило всего 12 минут и уже не критично в данном случае), вдруг резко отстает от «Нормального» по сжатию, причем даже хорошо сжимаемого DATABASE.MYD.
Таким образом, алгоритм BZip2 с уровнем «Нормальный» -- оптимальное универсальное решение для поставленной задачи.
Комментарии (1)
Никола-ленивец (2020-06-05, 13:17)
Отличная статья! Вот натурально радует, когда люди проявляют инженерный подход к решению задач, в наше время это редкость!