Производительность NTFS и большие объемы файлов и каталогов


Как Windows с NTFS работает с большими объемами файлов и каталогов?

есть ли какие-либо указания относительно ограничений файлов или каталогов, которые вы можете разместить в одном каталоге, прежде чем столкнуться с проблемами производительности или другими проблемами? например, это папка с 100 000 папок внутри нее нормально делать

7 169

7 ответов:

вот несколько советов от кого-то с окружающей средой, где у нас есть папки, содержащие десятки миллионов файлов.

  1. папка хранит информацию об индексе (ссылки на дочерние файлы и дочернюю папку) в индексном файле. Этот файл станет очень большим, когда у вас будет много детей. Обратите внимание, что он не различает ребенка, который является папкой, и ребенка, который является файлом. Единственное различие на самом деле заключается в том, что содержимое этого ребенка является либо индексом папки ребенка, либо данные файла ребенка. Примечание: Я несколько упрощаю это, но это получает точку зрения.
  2. индексный файл будет фрагментирован. Когда он становится слишком фрагментированным, вы не сможете добавить файлы в эту папку. Это связано с тем, что существует ограничение на количество фрагментов, которое разрешено. Это сделано специально. Я подтвердил это с Microsoft в вызове инцидента поддержки. Поэтому, хотя теоретический предел количества файлов, которые вы можете иметь в папке, составляет несколько миллиардов, удачи при запуске попадание десятки миллионов файлов, как вы нажмете ограничение фрагментации в первую очередь.
  3. однако не все так плохо. Вы можете использовать инструмент:contig.exe для дефрагментации этого индекса. Это не уменьшит размер индекса (который может достигать нескольких гигов для десятков миллионов файлов), но вы можете уменьшить количество фрагментов. Примечание: средство дефрагментации диска не будет дефрагментировать индекс папки. Он будет дефрагментировать данные файла. Только контиг.exe инструмент будет дефрагментировать индекс. К вашему сведению: вы можно также использовать это для дефрагментации данных отдельного файла.
  4. Если вы дефрагментируете, не ждите, пока вы не достигнете максимального # предела фрагмента. У меня есть папка, где я не могу дефрагментировать, потому что я ждал, пока не станет слишком поздно. Мой следующий тест-попытаться переместить некоторые файлы из этой папки в другую папку, чтобы посмотреть, смогу ли я дефрагментировать ее. Если это не удается, то что мне нужно сделать, это 1) создать новую папку. 2) переместить группу файлов в новую папку. 3) дефрагментируйте новую папку. повторите #2 & #3 пока это делается, а затем 4) удалите старую папку и переименуйте новую папку в соответствии со старой.

чтобы ответить на ваш вопрос более прямо: Если вы смотрите на записи 100K, не беспокойтесь. Иди развлекайся. Если вы смотрите на десятки миллионов записей, то либо:

a) планируйте разделить их на подпапки (например, допустим, у вас есть файлы 100M. Лучше хранить их в 1000 папках, так что у вас есть только 100 000 файлов в папке, чем хранить их в 1 большую папку. Это создаст 1000 индексов папок вместо одного большого, который с большей вероятностью достигнет максимального предела # фрагментов или

b) планируйте запустить contig.exe на регулярной основе, чтобы сохранить дефрагментацию индекса вашей большой папки.

читайте ниже, только если вам скучно.

фактический предел не на # фрагмента, а на количество записей сегмента данных, который хранит указатели на фрагмент.

Так что у вас есть сегмент данных, который хранит указатели на фрагменты данных каталога. Хранилища данных каталог о суб-каталоги и вложенные файлы, директории якобы хранятся. На самом деле, каталог ничего не "хранит". Это просто функция отслеживания и представления, которая представляет иллюзию иерархии для пользователя, так как сам носитель данных является линейным.

существуют также проблемы с производительностью при создании коротких имен файлов, замедляющих работу. Корпорация Майкрософт рекомендует отключить создание коротких файлов, если в папке находится более 300 тыс. файлов [1]. Чем менее уникальны первые 6 символов, тем больше это проблема.

[1] как работает NTFS от http://technet.microsoft.com, поиск "300,000"

Я создаю файловую структуру для размещения до 2 миллиардов (2^32) файлов и выполнил следующие тесты, которые показывают резкое падение производительности Navigate + Read примерно на 250 файлах или 120 каталогах в каталоге NTFS на твердотельном диске (SSD):

  • производительность файла падает на 50% между 250 и 1000 файлов.
  • производительность каталога падает на 60% между 120 и 1000 каталогами.
  • значения для чисел > 1000 остаются относительно стабильными

интересно, что количество каталогов и файлов существенно не мешает.

Итак, уроки:

  • номера файлов выше 250 стоят в 2 раза
  • каталоги выше 120 стоят в 2,5 раза
  • File-Explorer в Windows 7 может обрабатывать большие #файлы или #Dirs, но удобство использования по-прежнему плохо.
  • введение подкаталогов не дорого

Это данные (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; 
}

100,000 должно быть нормально.

Я (анекдотично) видел людей, имеющих проблемы со многими миллионами файлов, и у меня были проблемы с Explorer, просто не имея понятия, как считать последние 60 с чем-то тысяч файлов, но NTFS должен быть хорош для томов, о которых вы говорите.

в случае, если вам интересно, технический (и я надеюсь теоретической) максимальное количество файлов: 4,294,967,295

для локального доступа большое количество каталогов / файлов не кажется проблемой. Однако, если вы обращаетесь к нему по сети, есть заметное снижение производительности после нескольких сотен (особенно при доступе с компьютеров Vista (XP для Windows Server w/NTFS, казалось, работал намного быстрее в этом отношении)).

при создании папки с N записями создается список из N элементов на уровне файловой системы. Этот список является общесистемной общей структурой данных. Если вы затем начнете постоянно изменять этот список, добавляя / удаляя записи, я ожидаю, по крайней мере, некоторого конфликта блокировки над общими данными. Это утверждение - теоретически - может негативно повлиять на производительность.

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

У меня был реальный опыт работы с около 100 000 файлов (каждый несколько Мб) на NTFS в каталоге при копировании одной онлайн-библиотеки.

требуется около 15 минут, чтобы открыть каталог с помощью проводника или 7-zip.

написание копии сайта с помощью winhttrack всегда будет застревать через некоторое время. Он также имел дело с каталогом, содержащим около 1 000 000 файлов. Я думаю, что хуже всего то, что MFT может только последовательно проходить.

Открытие же под ext2fsd на ext3 дали почти такое же время. Вероятно, переезд в reiserfs (не reiser4fs) может помочь.

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

для ваших собственных программ с использованием больших двоичных объектов без каких-либо fs может быть полезно. Вот так Facebook для хранения фотографий.