Как Windows с NTFS работает с большими объемами файлов и каталогов?
Есть ли какие-либо рекомендации относительно ограничений для файлов или каталогов, которые вы можете поместить в один каталог, прежде чем вы столкнетесь с проблемами производительности или другими проблемами?
Например. нормально ли иметь папку со 100 000 папок внутри?
Ответы на соответствующий вопрос уступают принятому здесь ответу.
Эта реализация может быть полезна: github.com/acrobit/AcroFS
Связанный: ReFS обрабатывает большие объемы файлов, большие удаляются быстрее, чем NTFS?





100000 должно быть хорошо.
Я (анекдотически) видел, как у людей возникали проблемы с миллионами файлов, и у меня самого были проблемы с проводником, просто не знающий, как считать более 60 с лишним тысяч файлов, но NTFS должна быть хороша для томов, о которых вы говорите.
Если вам интересно, техническое (и я надеюсь, теоретический) максимальное количество файлов составляет: 4 294 967 295
Для непосвященных это большое количество (2 ^ 32 - 1) файлов.
Для локального доступа большое количество каталогов / файлов не является проблемой. Однако, если вы обращаетесь к нему по сети, заметное снижение производительности наблюдается после нескольких сотен (особенно при доступе с компьютеров Vista (от XP до Windows Server с NTFS, похоже, в этом отношении работало намного быстрее)).
Вы уверены, что это NTFS (дисковый протокол на сервере), а не SMB (сетевой уровень)?
Нет, я не проводил дальнейших исследований, чтобы сузить причину. Единственная информация, которая у меня есть, подробно описана выше.
Когда вы создаете папку с N записями, вы создаете список из N элементов на уровне файловой системы. Этот список представляет собой общесистемную общую структуру данных. Если вы затем начнете постоянно изменять этот список, добавляя / удаляя записи, я ожидаю, по крайней мере, некоторой конкуренции за блокировку общих данных. Этот конфликт - теоретически - может отрицательно повлиять на производительность.
Для сценариев только для чтения я не могу представить себе причину снижения производительности каталогов с большим количеством записей.
Вот несколько советов от кого-то, у кого есть среда, в которой у нас есть папки, содержащие десятки миллионов файлов.
Чтобы ответить на ваш вопрос более прямо: если вы просматриваете 100 тысяч записей, не беспокойтесь. Идите в нокаут. Если вы смотрите на десятки миллионов записей, то либо:
a) Планируйте разделить их на подпапки (например, допустим, у вас есть 100 миллионов файлов. Лучше хранить их в 1000 папок, чтобы у вас было только 100 000 файлов в папке, чем хранить их в одной большой папке. Это создаст 1000 индексов папок вместо одного большого, который с большей вероятностью достигнет максимального количества фрагментов или
б) Запланируйте запуск contig.exe на регулярной основе, чтобы индекс вашей большой папки оставался дефрагментированным.
Читайте ниже, только если вам скучно.
Фактическое ограничение не на количество фрагментов, а на количество записей сегмента данных, в котором хранятся указатели на фрагмент.
Итак, у вас есть сегмент данных, в котором хранятся указатели на фрагменты данных каталога. Данные каталога хранят информацию о подкаталогах и подфайлах, которые предположительно хранятся в каталоге. На самом деле каталог ничего не «хранит». Это просто функция отслеживания и представления, которая представляет для пользователя иллюзию иерархии, поскольку сам носитель данных является линейным.
Где я могу найти дополнительную информацию о contig.exe, его нет на моем сервере. Поиск в Google вернул эта страница технет, в котором не упоминаются подкаталоги или дефрагментация индекса папок.
Я узнал о фрагментации индексов контигов и папок во время телефонного разговора с инженером Microsoft. Их бесполезная техническая поддержка 1-3 уровня была огромной головной болью. (Эээ ... вы пробовали запустить chkdsk? Можете попробовать открыть папку в проводнике Windows? Можете ли вы проверить права доступа к папке?) FOOL! Я не собираюсь сидеть здесь 7 дней и ждать, пока ваш чертов chkdsk просканирует диск с десятками миллионов файлов !!
Инструмент contig не упоминает никаких переключателей командной строки для дефрагментации индексов, только файлы. Нужно ли дефрагментировать каждый файл в каталоге, чтобы также дефрагментировать индексы?
@ ss2k - Просто укажите contig.exe в каталог, я считать, который выполнит эту работу: contig -a . дает: C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file
Кроме того, если вы обнаружите, что вам нужно запустить contig для папок, в которых диск является точкой монтирования (так как он не будет работать с одной), вы можете просто прикрепить дополнительную букву диска в Diskmgmt для этого диска, а затем запустить contig per Комментарий Луми выше.
Afaik, начиная с Vista, есть некоторые механизмы, которые должны избегать наихудшей фрагментации. (правда, не все).
Это все еще проблема с SSD-дисками? Придется сделать папку с огромным количеством ярлыков внутри (около 6 мил). Я попробовал contig.exe в другой папке меньшего размера, и я вижу, что он очень фрагментирован (1075 фрагментов), но contig не дефрагментирует его.
@GPhilo Я могу подтвердить, что производительность SSD все еще снижается при использовании миллионов файлов. Я тоже пытался дефрагментировать папку, но contig ничего не сделал. Он действовал так, как если бы он был завершен, но демонстрировал одинаковую фрагментацию до и после запуска.
@mrb 'Если вы ДЕФРАГМИРУЕТЕ, не ждите, пока вы достигнете максимального количества фрагментов.' сбивает с толку. Текущая формулировка подразумевает, что дефрагментация не является обязательной, и ее следует учитывать после того, как вы решили дефрагментировать, что, я уверен, неверно. Было бы лучше прочитать: «Если вы думаете, что вам может понадобиться дефрагментация, не ждите, пока вы наберете максимальное количество фрагментов»?
Что касается запуска Contig для дефрагментации индекса, следует ли мне запускать contig на c:\my\big\directory, c:\my\big\directory\* или $mft? (или что-то другое?)
(Что касается приведенного выше sorta-ответа @Lumi, когда я указываю его на каталог, он, кажется, сканирует каждый отдельный файл в каталоге. Поэтому ответ остается неясным)
Влияет ли дефрагментация метаданных NTFS с помощью contig на работающую систему и как долго она обычно работает? Речь идет о ~ 8 миллионах файлов, занимающих 8 ТБ места.
Также есть проблемы с производительностью, связанные с созданием коротких имен файлов, что замедляет работу. Microsoft рекомендует отключать создание коротких имен файлов, если в папке более 300 КБ файлов [1]. Чем менее уникальны первые 6 символов, тем сложнее.
[1] Как работает NTFS от http://technet.microsoft.com, поиск "300 000"
Я бы добавил сюда цитату If you use large numbers of files in an NTFS folder (300,000 or more), disable short-file name generation for better performance, and especially if the first six characters of the long file names are similar. - избавляет от поиска подсказки "300 000". Кстати: набрать "300" будет достаточно (= здесь нет необходимости в буфере обмена)
Я создаю файловую структуру для размещения до 2 миллиардов (2 ^ 32) файлов и выполнил следующие тесты, которые показывают резкое падение производительности навигации + чтения примерно при 250 файлах или 120 каталогах на каталог NTFS на твердотельном накопителе ( SSD):
Интересно, что количество каталогов и файлов существенно НЕ мешает.
Итак, уроки таковы:
Это данные (2 измерения для каждого файла и каталога):
(FOPS = File Operations per Second)
(DOPS = Directory Operations per Second)
#Files lg(#) FOPS FOPS2 DOPS DOPS2
10 1.00 16692 16692 16421 16312
100 2.00 16425 15943 15738 16031
120 2.08 15716 16024 15878 16122
130 2.11 15883 16124 14328 14347
160 2.20 15978 16184 11325 11128
200 2.30 16364 16052 9866 9678
210 2.32 16143 15977 9348 9547
220 2.34 16290 15909 9094 9038
230 2.36 16048 15930 9010 9094
240 2.38 15096 15725 8654 9143
250 2.40 15453 15548 8872 8472
260 2.41 14454 15053 8577 8720
300 2.48 12565 13245 8368 8361
400 2.60 11159 11462 7671 7574
500 2.70 10536 10560 7149 7331
1000 3.00 9092 9509 6569 6693
2000 3.30 8797 8810 6375 6292
10000 4.00 8084 8228 6210 6194
20000 4.30 8049 8343 5536 6100
50000 4.70 7468 7607 5364 5365
А это тестовый код:
[TestCase(50000, false, Result = 50000)]
[TestCase(50000, true, Result = 50000)]
public static int TestDirPerformance(int numFilesInDir, bool testDirs) {
var files = new List<string>();
var dir = Path.GetTempPath() + "\Sub\" + Guid.NewGuid() + "\";
Directory.CreateDirectory(dir);
Console.WriteLine("prepare...");
const string FILE_NAME = "\file.txt";
for (int i = 0; i < numFilesInDir; i++) {
string filename = dir + Guid.NewGuid();
if (testDirs) {
var dirName = filename + "D";
Directory.CreateDirectory(dirName);
using (File.Create(dirName + FILE_NAME)) { }
} else {
using (File.Create(filename)) { }
}
files.Add(filename);
}
//Adding 1000 Directories didn't change File Performance
/*for (int i = 0; i < 1000; i++) {
string filename = dir + Guid.NewGuid();
Directory.CreateDirectory(filename + "D");
}*/
Console.WriteLine("measure...");
var r = new Random();
var sw = new Stopwatch();
sw.Start();
int len = 0;
int count = 0;
while (sw.ElapsedMilliseconds < 5000) {
string filename = files[r.Next(files.Count)];
string text = File.ReadAllText(testDirs ? filename + "D" + FILE_NAME : filename);
len += text.Length;
count++;
}
Console.WriteLine("{0} File Ops/sec ", count / 5);
return numFilesInDir;
}
Вы видите потерю производительности после 2 ^ 8 файлов, потому что вам нужно отключить генерацию коротких имен (генерация 8-символьных имен). См. technet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx
Привет, я попробовал это с помощью этой командной строки: fsutil.exe behavior set disable8dot3 1 После перезагрузки результаты были в основном такими же для менее чем 10000 файлов / каталогов. В статье говорится, что это важно только для больших чисел. Но то, что я увидел, было общим перфомансом. деградация, возможно, из-за более высокого коэффициента загрузки моего SSD (теперь он заполнен на 80% вместо 45%)
очень полезно, спасибо. Оценки миллионов, сказанные другими пользователями, далеки от этих числовых значений.
Даже после отключения генерации имени 8.3 вам все равно нужно полоска существующих имен 8.3, иначе будет мало улучшений в перечислении существующих файлов.
подробнее: blogs.technet.microsoft.com/josebda/2012/11/13/…
NTFS хранит каталоги как B-деревья. Те точки, где вы видите резкие изменения в производительности, - это просто когда B-дерево становится на один уровень глубже из-за роста. Эти точки могут различаться в зависимости от длины имени файла (поскольку NTFS пытается уместить столько записей в каждом узле B-дерева 4K, сколько позволяет пространство, а длина имени файла определяет размер каждой записи), а также от того, включены ли короткие имена ( потому что тогда NTFS, возможно, придется добавить две записи в файл вместо одной).
У меня был реальный опыт работы с примерно 100 000 файлов (каждый по несколько МБ) в NTFS в каталоге при копировании одной онлайн-библиотеки.
Открытие каталога с помощью проводника или 7-zip занимает около 15 минут.
Написание копии сайта с winhttrack всегда будет зависать через некоторое время. Речь шла и о директории, содержащей около 1 000 000 файлов. Я думаю, что хуже всего то, что MFT можно пройти только последовательно.
Открытие того же самого под ext2fsd на ext3 дало почти то же время. Возможно, переход на reiserfs (не reiser4fs) может помочь.
Лучше всего попытаться избежать этой ситуации.
Для ваших собственных программ использование BLOB-объектов без каких-либо fs может быть полезным. Вот как Facebook хранит фотографии.
Я не уверен, откуда вы взяли, что «MFT можно проходить только последовательно»? MFT содержит B-дерево и рассматривается как B-дерево.