Як кешувати чи іншим способом прискорити підсумки `du`?


33

У нас є велика файлова система, на якій повна duрезюме (використання диска) займає дві хвилини. Я хотів би знайти спосіб прискорити підсумок використання диска для довільних каталогів у цій файловій системі.

Для невеликих гілок я помітив, що duрезультати здаються кешованими, оскільки запити на повторення набагато швидше, але на великих гілках швидкість вгору стає незначною.

Чи існує простий спосіб пришвидшити duчи агресивніше кешувати результати для гілок, які не були змінені з попереднього пошуку?

Або є альтернативна команда, яка може швидше доставляти підсумки використання диска?


8
Дві хвилини мені не здаються такими довгими. Але справжнє запитання таке: "Ви дійсно хочете, щоб дю щось кешувала?" Чи не повинні ви дати точний, наскільки можливий, реальний блок диска?
Брюс Едігер

Я погоджуюся, що заміна duбуде поганою, але швидший сценарій обгортки з ідентичним інтерфейсом був би дуже корисним для нас. Крім того, я б очікував, що результати кешування залежать від останнього часу, модифікованого (і якщо припускати відсутність операцій, пов’язаних з диском, наприклад, дефрагментація) дадуть точний розмір результатів: я щось пропускаю?
Ian Mackinnon

2
Якщо вас турбує надто багато використання диска, ви можете розглянути можливість застосування квоти.
pyasi

2
Брюс - ти можеш задати те саме питання find. Але тут є locate.
Ювал

Якщо ви перебуваєте на Android , погляньте на StatFsдуже швидку оцінку розмірів каталогів. Це було майже в 1000 разів швидше для великих, складних каталогів, порівняно з du.
Джошуа Пінтер

Відповіді:


21

Те, що ви бачите при повторній команді du, - це ефект буферизації дисків. Після того, як ви читаєте блок, його дисковий буфер зберігається в кеш-пам'яті буфера, поки цей блок не знадобиться. Для цього вам потрібно прочитати каталог та вкладку для кожного файлу в каталозі. Результати в цьому випадку не кешовані, але можуть бути отримані з набагато меншим IO диска.

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

Сам каталог не має уявлення про те, наскільки великий файл, тому потрібно входити до кожного входу файлу. Щоб оновити кешоване значення актуальним щоразу, коли файл змінює розмір, кешоване значення потрібно буде оновлювати. Оскільки файл може бути перерахований у 0 або більше каталогах, це вимагатиме від inode кожного файлу знати, в яких каталогах він перелічений. Це значно ускладнить структуру inode та знизить продуктивність IO. Крім того, що du дозволяє отримувати результати, припускаючи різні розміри блоків, дані, необхідні в кеші, повинні будуть збільшувати або зменшувати кешоване значення для кожного можливого розміру блоку, що ще більше уповільнює продуктивність.


7

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

Для цього потрібно, щоб ваша файлова система підтримувала квоти по групах. Linux Ext [234] і Solaris / * BSD / Linux's zfs. Було б добре для вашого випадку використання, якщо групові квоти враховували ACL, але я не думаю, що вони роблять.


7

Загальне використання duможе бути надзвичайно прискорено за допомогою використання ncdu.

ncdu - NCurses Disk Usage

виконує du, кешує результати та показує їх у гарному командному рядку gui, дещо порівнянному з du -hc -d 1 | sort -h. Початкова індексація займає стільки ж часу du, але шукається справжній «винуватець», який заповнює дорогоцінний простір, оскільки всі підкаталоги мають початкову кешовану інформацію.

При необхідності підкаталоги можна оновити, натиснувши [r], а файли / папки можна видалити, натиснувши [d], обидва з яких оновлять статистику для всіх батьківських каталогів. Видалення просить підтвердити.

Якщо це необхідно, подальше прискорення може бути досягнуто за допомогою попереднього кешування ncdu -1xo- / | gzip >export.gzв Cronjob і згодом доступу до нього zcat export.gz | ncdu -f-, але, очевидно, дає більш застарілу інформацію.


7

Я вважаю за краще використовувати стареньку

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

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


4
Не відповідає на запитання, але все одно ставить +1. Приємна порада.
0xC0000022L

Я відредагував це питання, щоб зрозуміти, що це насправді відповідає на питання (ageu індексує використання диска, а також час доступу).
Ентоні Г - справедливість для Моніки

5

Як зазначає SHW, ageduсправді створено індекс. Я подумав, що поділюсь іншим способом створення індексу, прочитавши о locatedb. Ви можете створити власну версію a locatedbз duвиводу:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkпереставляє du вихід, щоб спочатку були імена файлів, так що це frcodeпрацює правильно. Потім скористайтеся locateцією базою даних для швидкого повідомлення про використання диска:

locate --database=du.locatedb pingus

Ви можете розширити це відповідно до своїх потреб. Я думаю, що це приємно використовувати locationb.


3
duc

(див. https://duc.zevv.nl ) може бути те, що ви шукаєте.

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

Оновлення індексу для мене дуже швидко (менше 10 сек. Для приблизно 950 к. Файлів у 121 к. Каталогах, 2,8 ТБ). Має також графічний інтерфейс та ncurses інтерфейс користувача.

Використання, наприклад:

duc index /usr
duc ui /usr

З веб-сайту:

Duc створений для масштабування до величезних файлових систем: він індексує та відображатиме сотні мільйонів файлів на петабайтах сховища без проблем.


2

У мене встановлено cronjob для запуску оновлених кожні 10 хвилин. Зберігає всі буфери файлової системи красивими та свіжими. Можна також використовувати цю дешеву ОЗУ для чогось хорошого. Скористайтеся плитами "до" та "після".


Я не розумію, як ваша відповідь стосується питання. updatedbнічого не говорить про використання диска. Якщо ви робите це лише для просування диска, ви зашкодите загальній продуктивності.
Жил "ТАК - перестань бути злим"

3
Підрахунок розмірів файлів duвідбувається повільно, оскільки ви маєте доступ до метаданих потенційно великої кількості файлів, розкиданих по диску. Якщо ви запустите оновленняb агресивно, метадані для всіх файлів змушені зберігатися в оперативній пам'яті. Наступного разу, коли ви запускаєте будь-яку іншу важку метаданих операцію, замість того, щоб робити тисячі пошуків на дисках, ви використовуєте кеш. Зазвичай у вас є невелика ймовірність збереження цієї конкретної частини метаданих дерева. З моїм "грунтуванням кешу метаданих" велика ймовірність, що потрібні вами дані будуть кешовані. Ніяких фізичних прагнень == ШВИДКО.
Марцін

2

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

du -hc | tail -n 1

Структура каталогу 2 ГБ займає більше секунди для повного переліку, але менше, ніж п'ята частина цієї форми.


2
Думаю du -hs, зручніше для цієї мети.
lepe

також--max-depth 1
stevesliva
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.