LINUX.ORG.RU
ФорумAdmin

Как уменьшить размер каталога, в котором было много удалённых файлов?

 , ,


0

5

Дело происходит на ext4. В некотором каталоге был, например, миллион файлов. Их в основном удалили, но размер иноды самого каталога (не файлов в нём) теперь около 120 Мбайт, поэтому зачастую действия с ним происходят весьма задумчиво. Не хочется его пересоздавать, можно ли как-то этот размер уменьшить?

можно ли как-то этот размер уменьшить

Да:

mkdir dir1.new
mv dir1/* dir1.new/
mv dir1/.* dir1.new/
rm -rf dir1/
mv dir1.new dir1

Ну, идею Вы поняли. А так, насколько я знаю, ext4 никогда не reclaim’ает место занятое директорией.

Edit: правда это не совсем вяжется с «Не хочется его пересоздавать», почему?

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)

а если натравить дефрагментатор ?? вполне вероятно они метадату пожмет.

pfg ★★★★★
()
Ответ на: комментарий от olegkrutov

На некоторых файловых системах операция выполнима с открытыми файлами.

Elyas ★★★★★
()
Ответ на: комментарий от olegkrutov

А не поможет переименование файлов одного за другим из этого каталога в другой на той же фс и обратно в этот?

iliyap ★★★★★
()
Ответ на: комментарий от bugfixer

Если так подходить к задаче - лучше применить не просто копирование, а жесткую или символьную ссылку ФС. Тогда можно пошаманить с содержимым каталога в фоне, а когда будет готово - стопануть сервисы, поменять source ссылки, и стартануть сервисы обратно. Такой финт ушами позволит уменьшить время рестарта системы до минимума.

pup_kin
()
Ответ на: комментарий от pup_kin

Символьная ссылка это явно не то.

А вот с жесткими ссылками можно было бы поиграться. Но лично моей квалификации для понимания всех происходящих при этом процессов не хватит.

AVL2 ★★★★★
()
Ответ на: комментарий от mky

Есть e2fsck -D, но, ИМХО, это не то, что вам хочется.

Мне тоже кажется, что это оптимальный вариант, но тогда нужен ребут.

e2fsck -D /dev/system/root 
e2fsck 1.46.3 (27-Jul-2021)
/dev/system/root is mounted.
e2fsck: Cannot continue, aborting.
AVL2 ★★★★★
()
Ответ на: комментарий от iliyap

А не поможет переименование файлов одного за другим из этого каталога в другой на той же фс и обратно в этот?

Нет.

bugfixer ★★★★★
()
Ответ на: комментарий от olegkrutov

Да, я понял. Чтоб процессы не прекращать

Вы чего-то не договариваете. Всё можно провернуть почти атомарно с минимальным downtime.

bugfixer ★★★★★
()
Ответ на: комментарий от pup_kin

лучше применить не просто копирование

Там копий нет. Там есть rename в пределах одной fs. Правильнее делать hardlinks из новой директории, замораживать сервисы, rotate директории, отпускать сервисы, прибивать старую директорию. Но нужно хорошо знать логику сервисов чтобы правильно бороться с race conditions.

bugfixer ★★★★★
()

Возможно fsck.ext4 -fvD поможет. Забавно, в NTFS таких проблем нет, у меня 10+ летние разделы живут отлично, каждый по 2 терабайта.

bonta ★★★★★
()
Ответ на: комментарий от bugfixer

Там копий нет. Там есть rename в пределах одной fs

Извиняюсь, невнимательно прочитал. Но моя идея про ссылки остается в силе, поскольку в предложенном Вами коде есть дубликат рабочего каталога «dir1.new», я его впопыхах принял за копию.

У ТС работа с каталогом медленно идёт, поэтому даже перемещение, а не только копирование может тормозить. Вот от этих тормозов, IMHO, я и предложил хак с ссылками ФС.

Ещё раз извините за невнимательность.

pup_kin
()
Последнее исправление: pup_kin (всего исправлений: 2)
Ответ на: комментарий от pup_kin

У ТС работа с каталогом медленно идёт, поэтому даже перемещение, а не только копирование может тормозить.

Всё правильно. Но как минимум один раз вычитать все эти 120Mb придётся так или иначе (пара секунд даже на старом добром HDD). Новый каталог будет настолько компактен насколько это возможно.

bugfixer ★★★★★
()
Ответ на: комментарий от pup_kin

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

vel ★★★★★
()

Спасибо, теперь я знаю, что EXT* ещё более убогая и устаревшая ФС чем я думал. Проблемы на уровне древней и примитивной FAT.

X512 ★★★★★
()
Ответ на: комментарий от X512

в них тоже есть свои плюсы и минусы :)
абсолюта светящего лучистым светом из-под небесья, чтоб все сразу так на ентую фс перешли, среди них нет.

pfg ★★★★★
()
Ответ на: комментарий от targitaj

Be File System. То что используется в Haiku. Использует B+ дерево для директорий.

X512 ★★★★★
()
Ответ на: комментарий от X512

Спасибо, теперь я знаю, что EXT* ещё более убогая и устаревшая ФС чем я думал. Проблемы на уровне древней и примитивной FAT.

Не всё так однозначно. Поведение директорий на ext4 в чём-то сравнимо с hash table: хотели бы Вы rehash’аться когда load factor падает ниже какого-то threshold после массового удаления элементов? Не уверен. В случае ext4 решение оставили за user space coders, и это правильно «я щитаю» - иначе бы возникали hiccups на пустом месте, в самые неожиданные моменты. Не надо недооценивать людей что за ext4 стоят.

bugfixer ★★★★★
()
Ответ на: комментарий от X512

XFS, ZFS, BFS, NTFS.

Я правильно понимаю что Вы глубоко знакомы со внутренностями всех этих fs types, и знаете как они себя ведут при удалении?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Мы перенесли или сделали хардлинк всех файлов в соседний каталог (в рамках одной фс). Переименовали каталоги.

Если процесс который работает с файлами этого каталога открывает их по полному пути, то проблем нет.

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

lsof/fuser это покажут.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Для BFS писал программу для чтения директорий. Там B+ дерево которое самобалансируется и в худшем случае заполнено наполовину. В XFS примерно тоже самое. Никаких фиксированных таблиц i-нодов, полностью динамическое выделение всех структур.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

EXT* ещё более убогая и устаревшая ФС чем я думал. Проблемы на уровне древней и примитивной FAT.

В «древней и примитивной FAT» как минимум изкаропки уже отсутствует проблема ограничения по инодам. То есть это уже на голову более совершенная файловая система.

LamerOk ★★★★★
()
Ответ на: комментарий от X512

Там B+ дерево которое самобалансируется и в худшем случае заполнено наполовину. В XFS примерно тоже самое. Никаких фиксированных таблиц i-нодов, полностью динамическое выделение всех структур.

Я не думаю что Вы понимаете о чём говорите.

bugfixer ★★★★★
()
Ответ на: комментарий от vel

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

Good point. Если процесс держит cwd за хвост в форме fd - так и произойдёт.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от LamerOk

65 тыc. кластеров это не ограничение?

Ну, а про fat32 написано, что там в каталоге может быть всего 65 тыс. записей (даже не файлов) https://answers.microsoft.com/en-us/windows/forum/all/what-is-the-maximum-num... На fat32 даже не протестить проблему, описываемую ТС.

mky ★★★★★
()
Ответ на: комментарий от Nastishka

С учетом что изначально в топике речь про мульон файликов, вот на этом этапе folder/* может возникнуть проблема. Лучше эту строку заменить на find...

anc ★★★★★
()
Ответ на: комментарий от anc

Их в основном удалили

Именно проблема в том, что файлов мало, но чтение каталога долгое, читается много пустых direntry.

Скорее, может возникнуть проблема с правами доступа. Я даже не знаю, есть ли команда, которая создаёт каталог и копирует все права с другого (включая acl, selinux).

mky ★★★★★
()
Ответ на: комментарий от mky

Я даже не знаю, есть ли команда, которая создаёт каталог и копирует все права с другого (включая acl, selinux).

cp... ^c :)

anc ★★★★★
()
Ответ на: комментарий от bonta

в NTFS таких проблем нет

Прямо сейчас наблюдаю директорию размером 160 килобайт, в которой осталось всего 7 файлов. (Смонтировал диск под линуксом, смотрю размер в MC.) Возможно, там просто преимущественное кеширование директорий, которое компенсирует задержки?

question4 ★★★★★
()
Ответ на: комментарий от mky

На fat32 даже не протестить проблему, описываемую ТС.

Неоднократно наблюдал её на флешке. Поставил неправильный размер тома архиватору, насоздавал мелких файлов, упёрся в лимит, удалил их, после этого чтение пустой директории длится секунд 5-10. Когда это случалось в корне, лечил форматированием.

question4 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.