Швидко стискайте велику кількість великих файлів


16

У мене щоденно генерується близько 200 ГБ даних журналів, які розподіляються між приблизно 150 різними файлами журналів.

У мене є сценарій, який переміщує файли у тимчасове місце і робить tar-bz2 у тимчасовому каталозі.

Я отримую хороші результати, оскільки журнали в 200 ГБ стискаються приблизно до 12-15 ГБ.

Проблема полягає в тому, що стискати файли потрібно назавжди. Робота з крон працює щодня о 2:30 та продовжує виконуватись до 5:00 - 6:00.

Чи є спосіб покращити швидкість стиснення і швидше виконати завдання? Будь-які ідеї?

Не турбуйтеся про інші процеси та все, що місце стиснення знаходиться в NAS , і я можу запустити монтування NAS на спеціальному VM та запустити сценарій стиснення звідти.

Ось результат зверху для довідки:

top - 15:53:50 up 1093 days,  6:36,  1 user,  load average: 1.00, 1.05, 1.07
Tasks: 101 total,   3 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.1%us,  0.7%sy,  0.0%ni, 74.1%id,  0.0%wa,  0.0%hi,  0.1%si,  0.1%st
Mem:   8388608k total,  8334844k used,    53764k free,     9800k buffers
Swap: 12550136k total,      488k used, 12549648k free,  4936168k cached
 PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7086 appmon    18   0 13256 7880  440 R 96.7  0.1 791:16.83 bzip2
7085  appmon    18   0 19452 1148  856 S  0.0  0.0   1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon    15   0 85952 1944 1000 S  0.0  0.0   0:00.00 sshd: appmon@pts/0
30757 appmon    15   0 64884 1816 1032 S  0.0  0.0   0:00.01 -tcsh

2
Якщо у вас декілька процесорів і ви маєте або можете розділити їх на кілька файлів tar, ви можете запустити кілька компресій.
Джефф Шаллер

@JeffSchaller чи можна було б отримати декілька процесів bzip2, які стискають різні файли, але записують в один і той же tar.bz2файл?
ану

2
Чи створюються файли журналів на локальному диску перед переходом до NAS? Якщо так стиснути, тоді рухайтеся; таким чином ви надсилаєте лише 15Gb даних по мережі, а не 100 (переміщення), а потім 115 (100 прочитаних + 15write) при стисканні. Крім того, схоже, що ви можете бути пов'язані з процесором у цьому одному bzip2, тому запуск декількох паралельно (один на процесор) може допомогти (поки ви не досягнете межі вводу / виводу). Або використовувати більш просте стиснення (наприклад, "gzip -1"). Це не заощадить стільки місця на диску, але запуститься швидше.
Стівен Харріс

@Sukminder Я обов'язково спробую це і побачу різницю в розмірах. Спасибі.
ану

Ваш topвихід показує , що ваш однопоточних bzip2процес максі одне ядро, але що ви використовуєте його на чотирьохядерний системі (один процес з використанням 100% CPU -> 25.1%просторів перед CPU часу, 74% на холостому ходу). Тож із незначними змінами ви можете швидко пройти в 4 рази, якщо щось інше не стане вузьким місцем. Прочитайте відповідь Гілла уважно. Подумайте про використання ЦП у тому самому полі, що й диски, на яких є дані, щоб зробити стиснення. (Ви можете навіть стиснути деякі файли в одному вікні, інші - в іншому і після цього архівувати, так що обидва процесори використовуються.)
Peter Cordes

Відповіді:


25

Перший крок - розібратися, що таке вузьке місце: це дисковий введення / вивід, мережевий ввод / вивід чи процесор?

Якщо вузьким місцем є введення / виведення диска, ви не можете багато чого зробити. Переконайтесь, що диски не обслуговують багато паралельних запитів, оскільки це може лише знизити продуктивність.

Якщо вузьким місцем є мережевий ввод-вивід, запустіть процес стиснення на машині, де зберігаються файли: запуск його на машині з процесором-програвачем, що допомагає, лише якщо ЦП є вузьким місцем.

Якщо вузьким місцем є процесор, то перше, що слід врахувати, - це використання алгоритму швидшого стиснення. Bzip2 не обов'язково є поганим вибором - головна його слабкість - швидкість декомпресії - але ви можете використовувати gzip і пожертвувати деяким розміром для швидкості стиснення, або спробувати інші формати, такі як lzop або lzma. Ви також можете налаштувати рівень стиснення: bzip2 за замовчуванням -9(максимальний розмір блоку, таким чином максимальне стиснення, але також найдовший час стиснення); встановити змінну середовища BZIP2на таке значення, як -3спробувати рівень стиснення 3. Цей потік і цей потік обговорюють загальні алгоритми стиснення; зокрема ця публікація в блозі, на яку посилається derobert, дає деякі орієнтири, які дозволяють припустити, що gzip -9абоbzip2з низьким рівнем може бути хорошим компромісом порівняно з bzip2 -9. Цей інший орієнтир, який також включає lzma (алгоритм 7zip, тому ви можете використовувати 7zзамість цього tar --lzma), дозволяє припустити, що lzmaна низькому рівні швидше досягти коефіцієнта стиснення bzip2. Практично будь-який вибір, крім bzip2, покращить час декомпресії. Майте на увазі, що коефіцієнт стиснення залежить від даних, а швидкість стиснення залежить від версії програми стиснення, від того, як вона була складена та від процесора, на якому вона виконується.

Інший варіант, якщо вузьким місцем є процесор, і у вас є кілька ядер, - це паралелізація стиснення. Є два способи зробити це. Одна з функцій алгоритму стиснення - стиснути файли окремо (окремо або в декількох групах) і parallelпаралельно виконувати команди архівування / стиснення. Це може зменшити коефіцієнт стиснення, але збільшує швидкість пошуку окремого файлу та працює з будь-яким інструментом. Інший підхід полягає у використанні паралельної реалізації інструменту стиснення; ця нитка перелічує кілька.


4
"Якщо вузьким місцем є введення / виведення диска, ви не можете багато чого зробити". Це, мабуть, справедливо і тут, оскільки коефіцієнт стиснення вже хороший, але загалом, коли введення / виведення є вузьким місцем, то варто розглянути використання більше процесора, щоб отримати кращий коефіцієнт стиснення (використовуючи різні настройки стиснення або інший алгоритм). .. ви не можете реально зменшити "я" (тому що вам потрібно прочитати всі дані), але ви можете іноді значно зменшити "O" :-)
psmears

1
Якщо ви скажете 7zне робити "суцільний" архів або обмежити розмір "суцільних" блоків, він запустить паралельно змішані потоки LZMA, IIRC. Дані файлу журналу є особливим випадком стиснення, оскільки він, як правило, надлишковий (багато подібності між рядками). Це, безумовно, варто перевірити gzip, bzip2і xzна конкретних файлах журналу ОП, а не просто дивитися на загальні показники стиснення, щоб виключити будь-які варіанти. Навіть швидкі компресори варто врахувати , ( lzop, lz4, snappy).
Пітер Кордес

Найкращим компресором LZMA в ці дні є xz. Використовуйте tar -Jабо --xz, не --lzma. .lzmaвважається "застарілим" форматом файлів . Багаторазові ітерації форматів файлів для стиснення LZMA - це трохи збентежило, і те, що вони повинні були отримати правильно вперше. Але для AFAIK це в принципі добре, і .xz вже не збирається замінити ще одним форматом файлів для того ж потоку стиснення.
Пітер Кордес

7z має відмінні стиснення та багатопотоковість, але через формат архіву (потрібен індекс чи, можливо, помилки?) Я не думаю, що його можна використовувати в середині конвеєра - він не використовуватиме stdin та stdout водночас
Xen2050

Це було справді корисно та проникливо. Моя команда вважала, що операція над NFS - це велике вузьке місце.
ану

16

Ви можете встановити pigz, паралельно gzip та використовувати tar при багатопотоковому стисненні. Подобається:

tar -I pigz -cf file.tar.gz *

Де -Iваріант:

-I, --use-compress-program PROG
  filter through PROG

Звичайно, якщо ваш NAS не має декількох ядер / потужний процесор, ви все одно обмежені потужністю процесора.

Швидкість жорсткого диска / масиву, на якій працює VM та стискання, також може бути вузьким місцем.


1
І якщо ви хочете використовувати bzip2, ви можете використовувати pbzip2або lbzip2.
Радован Гарабік

2
Це ваша найкраща відповідь. Але спочатку переконайтеся, що ваш перший хід - до місця, яке знаходиться в тій же файловій системі, що і вихідні файли. В іншому випадку ваш "хід" - це дійсно байт-копія-потім-видалення. У цій же файловій системі хід - це перестановка посилань файлової системи. Це на порядок швидше. Для моїх журналів, що мають сотні гігабайт великих розмірів, pigz змінив усе значення. Ви можете сказати, скільки паралельних потоків для запуску. Поки ваш процесор має декілька ядер, я б не витрачав багато часу на дослідження. Ви, швидше за все, захочете порося в будь-якому випадку; ви можете отримати швидкість відразу.
Майк S

Після того, як ви піггінгу, перегляньте свої виходи на htop та iostat і спостерігайте за роботою системи, якщо ви хочете далі дослідити вашу систему. Але знову ж таки, я більше не буду намагатися стискати великі файли без pigs. У сучасній багатоядерній системі просто нерозумно нею користуватися. Це такий негайний виграш - побачите.
Майк S

7

На сьогодні найшвидший і найефективніший спосіб стиснення даних - це генерувати менше їх.

Які типи колод ти генеруєш? 200 Гб щодня звучить як дуже багато (якщо ви не Google або інший провайдер ...), врахуйте, що 1 Мб тексту становить близько 500 сторінок, тож ви генеруєте еквівалент 100 мільйонам сторінок тексту в день, заповнити бібліотеку конгресу за тиждень.

Подивіться на дані своїх журналів, чи зможете ви якимось чином їх зменшити і все-таки отримати те, що вам потрібно з журналів. Наприклад, зменшивши рівень журналу або використовуючи термінальний формат журналу. Або якщо ви використовуєте журнали для статистики, обробляйте статистику на ходу та скидайте файл із підсумком, а потім фільтруйте журнали перед стисненням для зберігання.


1
Це цікаве філософське рішення. Рішення більшості життєвих проблем полягає у тому, щоб взагалі не виникати проблеми, чи не так. Це до тих пір, поки не уважно вивчить пропозицію і не зрозуміє, що для досягнення цього необхідно 100 людей і 1000 тисяч схвалень.
ану

1
@anu Ніякого контексту на запитання не було, тому я припускав, що його немає. І чи не могли б ви сказати мені, звідки ви отримали номер 1000 схвалень? Мені здається, що ти щойно це придумав.
Емілі Л.

Я підкорюю це. Це часто недооцінене, але помічене колись вирішення багатьох життєвих проблем.
jrw32982 підтримує Моніку

1
Ну .. тепер, коли я більше не працюю там, я можу принаймні розкрити, що це була проблема в Apple. Більш конкретно, на сервісному стеку, який обслуговує інтернет-магазин додатків ... так, так, 1000 тисяч схвалень - це справді реальність, оскільки у них є тисячі мікросервісів, і кожен з них виробляє журнали, які потрібно стиснути, і доведеться входити в систему під час зміни своїх рівні реєстрації тощо ... У будь-якому разі ... ми розібралися з рішенням для цього будинку BTW .., що майже рівнозначно паралельному gzip, який завантажується в інші мікросервіси.
ану

3

Ви можете зменшити кількість стиснення (з точки зору заощадженого місця), щоб зробити його швидшим. Для початку bzip2 набагато повільніше, ніж gzip, хоча він стискає менше. Ви також можете змінити рівень стиснення bzip2, gzip або більшості програм стиснення на розмір торгівлі для швидкості.

Якщо ви не бажаєте торгувати розміром швидкості, ви, ймовірно, можете отримати однаковий розмір або менший розмір, все одно отримуючи підвищення швидкості за допомогою компресора, який використовує LZMA (наприклад, xz).

Якщо ви шукаєте, ви знайдете орієнтири, але найкраще робити кілька тестів із власним файлом на вашому цільовому обладнання.


3

Якщо єдиною вимогою є стиснення швидко , я рекомендую lz4 дуже високо.

Він використовується в багатьох місцях, де швидкість стиснення важливіша, ніж коефіцієнт стиснення (наприклад, файлові системи з прозорим стисненням, як ZFS)


Ніколи раніше про нього не чули, чи існує програма, яка, ймовірно, вже встановлена ​​практично скрізь, де вона використовується, як-от xz?
Xen2050
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.