Comments 50
Пользуйтесь нормальными ФС где indode аллокируются динамически, а не так как у extX приколочены гвоздями в группам распределения и выделяются при первичном форматировании и больше — ни ни.
С Zfs, как и со многими FS другая проблема — при заполнении раздела на >95% происходит деградация производительности.
о! как раз хотел узнать об ограничении на количество файлов в директории в разных FAT? а для fat32 и ntfs, ограничения какие-то накладывают на кол-во файлов в каталоге?
В fat32 корень вообще из одного элемента, указывающего на файл корневой директории.
В ntfs примерно так же, только «базовых файлов» там несколько — и корневая директория, и таблица занятости, и т.д. И мелкие файлы могут быть размещены прямо как поле данных в каталоге, рядом с именем.
В FAT32 корневая директория это файл без дескриптора (т.е. находится в области данных), первый кластер которого №=2. Т.е., если одного кластера не хватает, система его расширит следующим свободным кластером в таблице FAT (не обязательно соседним). Т.е., теоретически можно создать такой большой корневой каталог, что все кластеры будут принадлежать ему. Записать туда, например, метки диска.
После форматирования это действительно 2, но вот после дефрагментации может быть по-разному
В FAT установлен предел 65535 запией. Поичем первые две заняты точкой (ссылка на себя) и двумя точками (ссылка наверх).
Если используются длинные имена (в формате, отличном от 8.3), то будет еще меньше (каждое длинное имя "крадет" несколько записей).
.
В интернетах пишут, что для NTFS — 2^32-1 файлов, а для FAT32 размер директории ограничен реализацией — 2 мегабайта, что соответствует 64K записям формата 8.3. В случае использования длинных имён инфа от имени размещается в этих записях, по 13 символов на запись. В случае использования длинных имён может использоваться до 20 записей на один файл +1 вхождение для формата 8.3, что в итоге приводит к 3120 файлам с именами 255-байтной длины.
PS Путь и имя почти никогда не достигают 255 символов. Я часто попадал в ограничение примерно на 224 +- символов в полном пути+имя.
Кроме того, в fat директория это линейный список; время доступа к файлу очень сильно зависит от его размера. 65533 файлов в директории — чистое зло.
В директории имена файлов идут списком — и если какой-то файл удален, то запись о нем просто помечается как пустая. Иначе для больших директорий на каждое удаление пришлось бы менять все содержимое директории — а это повышенная нагрузка на кэши и всякое такое.
И кстати, линукс тут неуиноуат — в винде точно такая же проблема.
Интересно было бы поиграться с различными файловыми системами, где имена файлов в директориях хранятся не списком, а в виде двоичного дерева (btrfs вроде такая).
$ mkdir niceDir && cd niceDir
$ ls -lhd.
drwxrwxr-x 1 stc stc 0 авг 2 18:22.
$ for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i; done
$ ls -lhd.
drwxrwxr-x 1 stc stc 8,5M авг 2 18:21.
$ find. -type f -delete
$ ls -l
total 0
$ ls -lhd.
drwxrwxr-x 1 stc stc 0 авг 2 18:22.
В Btrfs пустой каталог 0, после очистки каталога — тоже 0.
С b-tree при удалении нет смысла оставлять блоки, которые больше не используются — они все уходят в свободные.
XFS:
$ mkdir niceDir && cd niceDir
$ ls -lhd.
drwxrwxr-x 2 stc stc 6 авг 2 18:42.
$for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i; done
$ ls -lhd.
drwxrwxr-x 2 stc stc 6,2M авг 2 18:47.
$ find. -type f -delete
$ ls -lhd.
drwxrwxr-x 2 stc stc 6 авг 2 18:47.
Примерно так же.
adminx@xxxx:/informatica_cache/SessLogs> ls -ldh
drwxr-xr-x 5 adminx etl 85M Aug 5 07:53.
adminx@xxxx:/informatica_cache/SessLogs> ls -l | grep -c ""
970181
ls -1 >> ~/filelist
adminx@xxxx:/informatica_cache/SessLogs> ls -lath ~/filelist
-rw-r--r-- 1 adminx etl 68M Aug 5 07:58 /home/adminx/filelist
Тут конечно больше интересно, как большое количество файлов влияет на производительность при чтении/создании/изменении файла.
Экономически не выгодно :)
Потому переиспользование записей — выполняется, а вот их освобождение — нет. Никому не нужно ибо. Если у вас в директории было 500тыс файлов, значит, вполне вероятно, скоро опять будет столько же. Тоесть нет смысла освобождать.
Если каталог лежит в b-tree, то смысла как-то искусственно сохранять выделенные блоки, которые уже не используется деревом — нет. И например (см. выше) btrfs и xfs после удаления таки все освобождают.
Но зато на том же тесте с заполнением каталогов она у меня сделала btrfs на том же диске:
btrfs:
$ time for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i; done
real 3m29,141s
user 2m22,319s
sys 1m24,666s
xfs:
$ time for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i; done
real 3m23,376s
user 2m20,233s
sys 1m19,493s
И это при том что btrfs тоже изрядно все кеширует, но все-же не так агрессивно как xfs.
Сначала делаете rsync в другую дерикторию, потом меняете названия и удаляете старую.
И не надо ничего отмонтировать.
Ну, наверно можно то же самое сделать и внутри FS, но как правильно написали в мейлисте никому это не нужно по сути. А этот код потом поддерживать.
Можно написать внешнюю утилиту. Которая сначала скопирует содержание всех блоков в другую директорию, потом эту удалит и переименует. Но возникает вопрос с файлами открытыми приложениями в данный момент.
А разве на жесткие ссылки нет ограничений? вроде на каталог не может указывать, не?
Что приводит к забавному эффекту: если вы на флешке (то бишь FAT) создаёте каталог, то Linux занесёт дату создания в элементы "." и ".." в этом каталоге — а изменить это будет невозможно никак, в принципе.
То есть, в частности, воспользовавшись советом arheops вы внесёте изменение, которое потом будет видно из-под Windows… несмотря на то, что rsync, вроде как старается даты модификаций файлов и все аттрибуты сохранять.
a) создаем миллион файлов и плачем о потерянных 8Mb
b) хотим миллион файлов но не заботимся об оптимизации и регулярном fsck
Размер директорий не стоит наших усилий