Как кэшировать или иным образом ускорить `ду` резюме?

33

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

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

Есть ли простой способ ускорить duили более агрессивно кэшировать результаты для веток, которые не были изменены со времени предыдущего поиска?

Или есть альтернативная команда, которая может доставить резюме использования диска быстрее?

Ян Маккиннон
источник
8
Две минуты не кажутся мне такими длинными. Но реальный вопрос: «Вы действительно хотите, чтобы дю что-нибудь кешировал?» Разве вы не должны давать вам точное, как возможно, текущее число возможных блоков диска?
Брюс Эдигер
Я согласен, что замена duбыла бы плохой, но более быстрый скрипт-обертка с идентичным интерфейсом был бы очень полезен для нас. Кроме того, я ожидаю, что результаты кэширования, зависящие от времени последнего изменения (и при условии отсутствия операций на диске, например, дефрагментации), дадут точные результаты размера: я что-то упустил?
Ян Маккиннон
2
Если вас беспокоит слишком большое использование диска, вы можете рассмотреть вопрос о введении квоты.
Пяси
2
Брюс - ты мог бы задать тот же вопрос find. Но тогда есть locate.
Ювал
Если вы используете Android , обратите внимание на StatFsочень быструю оценку размеров каталогов. Это было почти в 1000 раз быстрее для больших и сложных каталогов, по сравнению с du.
Джошуа Пинтер

Ответы:

21

Когда вы снова запускаете команду du, вы видите эффект буферизации диска. Когда вы читаете блок, его дисковый буфер сохраняется в буферном кеше, пока этот блок не понадобится Для этого вам нужно прочитать каталог и индекс для каждого файла в каталоге. Результаты du не кэшируются в этом случае, но могут быть получены с гораздо меньшим дисковым вводом-выводом.

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

Сам каталог не имеет представления о размере файла, поэтому необходимо получить доступ к индексу каждого файла. Чтобы сохранить кэшированное значение в актуальном состоянии каждый раз, когда файл изменял размер, кэшированное значение необходимо будет обновить. Поскольку файл может быть указан в 0 или более каталогах, для этого требуется, чтобы индекс каждого файла знал, в каких каталогах он указан. Это значительно усложнило бы структуру индекса и снизило производительность ввода-вывода. Кроме того, поскольку du позволяет получать результаты, предполагая различные размеры блоков, данные, необходимые в кэше, должны увеличивать или уменьшать кэшированное значение для каждого возможного размера блока, что еще больше снижает производительность.

BillThor
источник
7

Если вы можете сделать так, чтобы разные иерархии файлов принадлежали разным группам, вы можете установить дисковые квоты . Не указывайте верхний предел (или размер диска), если он вам не нужен. Вы по-прежнему сможете мгновенно определить, какую часть своей (фактически бесконечной) квоты использует группа.

Это требует, чтобы ваша файловая система поддерживала квоты для каждой группы. Linux Ext [234] и Solaris / * BSD / Linux делают zfs. Было бы хорошо для вашего случая использования, если групповые квоты принимали во внимание ACL, но я не думаю, что они делают.

Жиль "ТАК - прекрати быть злым"
источник
7

Обычное использование duможет быть значительно ускорено при использовании ncdu.

ncdu - NCurses Disk Usage

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

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

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

DennisH
источник
7

Я предпочитаю использовать Ageu

Agedu - это программное обеспечение, которое пытается найти старые и нерегулярно используемые файлы, предполагая, что эти файлы, скорее всего, не нужны. (Например, загруженные файлы, которые были просмотрены только один раз.)

Он в основном выполняет тот же тип сканирования диска du, что и записывает время последнего доступа ко всему, что сканирует. Затем он создает индекс, который позволяет ему эффективно генерировать отчеты с краткой информацией о результатах для каждого подкаталога, а затем создает эти отчеты по запросу.

SHW
источник
4
Не отвечает на вопрос, но все равно +1. Хороший совет.
0xC0000022L
Я отредактировал вопрос, чтобы было яснее, что это действительно отвечает на вопрос (ageu индексирует использование диска, а также время доступа).
Энтони Дж. - правосудие для Моники
5

Как уже упоминалось в SHW, ageduдействительно создан индекс. Я думал, что поделюсь другим способом создания индекса после прочтения locatedb. Вы можете создать свою собственную версию locatedbиз duвывода:

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

awkпереставляет вывод du, чтобы сначала иметь имена файлов, чтобы это frcodeработало правильно. Затем используйте locateэту базу данных, чтобы быстро сообщить об использовании диска:

locate --database=du.locatedb pingus

Вы можете расширить это в соответствии с вашими потребностями. Я думаю, что это хороший вариант использованияb.

Юваль
источник
3
duc

(см. https://duc.zevv.nl ) может быть то, что вы ищете.

Duc сохраняет использование диска в оптимизированной базе данных, что обеспечивает быстрый пользовательский интерфейс. Нет времени ожидания после завершения индекса.

Обновление индекса очень быстро для меня (менее 10 секунд для файлов размером около 950 КБ в каталогах 121 КБ, 2,8 ТБ). Имеет графический интерфейс и пользовательский интерфейс ncurses.

Использование, например:

duc index /usr
duc ui /usr

С веб-сайта:

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

Питер
источник
2

У меня есть cronjob, настроенный для запуска updatedb каждые 10 минут. Сохраняет все буферы файловой системы красивыми и свежими. Можно также использовать эту дешевую оперативную память для чего-то хорошего. Используйте slabtop, чтобы увидеть «до» и «после».

Marcin
источник
Я не понимаю, как ваш ответ связан с вопросом. updatedbничего не говорит об использовании диска. Если вы делаете это только для обхода диска, это ухудшит общую производительность.
Жиль "ТАК - перестань быть злым"
3
Подсчет размеров файлов для duмедленен, потому что вам нужно получить доступ к метаданным потенциально большого количества файлов, разбросанных по всему диску. Если вы активно используете updatedb, метаданные для всех файлов будут сохранены в оперативной памяти. В следующий раз, когда вы запустите любую другую сложную для метаданных операцию, вместо тысяч поисков по дискам вы будете использовать кеш. Обычно у вас есть небольшой шанс кэширования этой конкретной части метаданных дерева. С моим «заполнением кеша метаданных» весьма вероятно, что нужные вам данные будут недавно кэшированы. Нет физических поисков == БЫСТРО.
Марчин
2

Если вам нужно знать только размер каталога, вы можете значительно ускорить его, просто избегая вывода информации на экран. Поскольку итоговая сумма является последней строкой duкоманды, вы можете просто передать ее tail.

du -hc | tail -n 1

Структура каталога объемом 2 ГБ занимает более секунды для полного списка, но менее 5-й от этой формы.

Фрэнк
источник
2
Я думаю, что du -hsболее удобно для этой цели.
Лепе
1
также--max-depth 1
стевеслива