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

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

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

Например. нормально ли иметь папку со 100 000 папок внутри?


person James Newton-King    schedule 13.10.2008    source источник
comment
Ответы на соответствующий вопрос уступают принятому здесь ответу.   -  person Eric J.    schedule 30.10.2014
comment
Эта реализация может быть полезной: github.com/acrobit/AcroFS   -  person Ghominejad    schedule 22.12.2017


Ответы (7)


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

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

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

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

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

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

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

Итак, у вас есть сегмент данных, в котором хранятся указатели на фрагменты данных каталога. Данные каталога хранят информацию о подкаталогах и подфайлах, которые предположительно хранятся в каталоге. На самом деле каталог ничего не «хранит». Это просто функция отслеживания и представления, которая представляет для пользователя иллюзию иерархии, поскольку сам носитель данных является линейным.

person MrB    schedule 14.11.2008
comment
Где я могу найти дополнительную информацию о contig.exe, его нет на моем сервере. Поиск в Google дал эту техническую страницу, на которой не упоминаются подкаталоги или дефрагментация индекса папки. - person Evan Carroll; 25.06.2010
comment
Я узнал о фрагментации индексов контигов и папок во время телефонного разговора с инженером Microsoft. Их бесполезная техническая поддержка 1-3 уровня была огромной головной болью. (Эээ ... вы пробовали запустить chkdsk? Можете попробовать открыть папку в проводнике Windows? Можете ли вы проверить права доступа к папке?) ДУРА! Я не собираюсь сидеть здесь 7 дней и ждать, пока ваш чертов chkdsk просканирует диск с десятками миллионов файлов !! - person MrB; 26.06.2010
comment
Инструмент contig не упоминает никаких переключателей командной строки для дефрагментации индексов, только файлы. Нужно ли дефрагментировать каждый файл в каталоге, чтобы также дефрагментировать индексы? - person ss2k; 25.03.2011
comment
@ ss2k - Просто укажите contig.exe на каталог, я думаю, который выполнит эту работу: contig -a . дает: C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file - person Lumi; 25.08.2011
comment
Кроме того, если вы обнаружите, что вам нужно запустить contig для папок, в которых диск является точкой монтирования (так как он не будет работать с одной), вы можете просто добавить дополнительную букву диска в Diskmgmt для этого диска, а затем запустить contig per Комментарий Луми выше. - person Quantum Elf; 02.03.2014
comment
Afaik, начиная с Vista, есть некоторые механизмы, которые должны избегать наихудшей фрагментации. (правда, не все). - person Marco van de Voort; 07.05.2015
comment
Это все еще проблема с SSD-дисками? Придется сделать папку с огромным количеством ярлыков внутри (около 6 мил). Я попробовал contig.exe в другой папке меньшего размера, и я вижу, что он очень фрагментирован (1075 фрагментов), но contig не может его дефрагментировать. - person GPhilo; 26.06.2017
comment
@GPhilo Я могу подтвердить, что производительность SSD все еще снижается при использовании миллионов файлов. Я тоже пытался дефрагментировать папку, но contig ничего не сделал. Он действовал так, как если бы он был завершен, но демонстрировал одинаковую фрагментацию до и после запуска. - person Bram Vanroy; 06.09.2017
comment
@mrb 'Если вы ДЕФРАГМИРУЕТЕ, не ждите, пока вы достигнете максимального количества фрагментов.' сбивает с толку. Текущая формулировка подразумевает, что дефрагментация не является обязательной, и ее следует учитывать после того, как вы решили дефрагментировать, что, я уверен, неверно. Было бы лучше прочитать: «Если вы думаете, что вам может понадобиться дефрагментация, не ждите, пока вы наберете максимальное количество фрагментов»? - person mikemaccana; 30.05.2018
comment
Что касается запуска Contig для дефрагментации индекса, следует ли мне запускать contig на c:\my\big\directory, c:\my\big\directory\* или на $mft? (или что-то другое?) - person Stephen R; 27.06.2018
comment
(Что касается приведенного выше sorta-ответа @Lumi, когда я указываю его на каталог, кажется, что он сканирует каждый отдельный файл в каталоге. Так что ответ остается неясным) - person Stephen R; 27.06.2018
comment
Влияет ли дефрагментация метаданных NTFS с contig на работающую систему и как долго она обычно работает? Речь идет о ~ 8 миллионах файлов, занимающих 8 ТБ места. - person Janis Veinbergs; 17.04.2020

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

[1] Как работает NTFS из http://technet.microsoft.com, введите" 300 000 ".

person Tony Lee    schedule 25.03.2009
comment
Я бы добавил здесь цитату 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 будет достаточно (= здесь нет необходимости в буфере обмена) - person Wolf; 19.04.2017

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

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

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

Итак, уроки таковы:

  • Номера файлов выше 250 стоят множитель 2.
  • Каталоги выше 120 стоят коэффициент 2,5.
  • Проводник в Windows 7 может обрабатывать большие файлы #Files или #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; 
}
person Spoc    schedule 05.10.2014
comment
Вы видите потерю производительности после 2 ^ 8 файлов, потому что вам нужно отключить генерацию коротких имен (генерация 8-символьных имен). См. technet.microsoft.com/en-us/ библиотека / cc781134 (v = ws.10) .aspx - person Kyle Falconer; 15.06.2015
comment
Привет, я попробовал это с помощью этой командной строки: fsutil.exe behavior set disable8dot3 1 После перезагрузки результаты были в основном такими же для менее чем 10000 файлов / каталогов. В статье говорится, что это важно только для больших чисел. То, что я увидел, было общим перфомансом. деградация, возможно, из-за более высокого коэффициента загрузки моего SSD (теперь он заполнен на 80% вместо 45%) - person Spoc; 25.10.2015
comment
очень полезно, спасибо. Оценки миллионов, сказанные другими пользователями, далеки от этих числовых значений. - person Adrian Maire; 10.01.2017
comment
Даже после отключения генерации имен 8.3 вам все равно нужно удалить существующие имена 8.3, иначе перечисление существующих файлов не улучшится. - person Stephen R; 27.06.2018
comment
подробнее: blogs.technet.microsoft.com/josebda/2012/11/13/ - person Stephen R; 27.06.2018
comment
NTFS хранит каталоги как B-деревья. Те точки, где вы видите резкие изменения в производительности, - это просто когда B-дерево становится на один уровень глубже из-за роста. Эти точки могут различаться в зависимости от длины имени файла (поскольку NTFS пытается вместить столько записей в каждом узле B-дерева размером 4 КБ, сколько позволяет пространство, а длина имени файла определяет размер каждой записи), а также от того, включены ли короткие имена ( потому что тогда NTFS, возможно, придется добавить две записи в файл вместо одной). - person Craig Barkhouse; 29.04.2020

100000 должно быть хорошо.

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

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

person Oli    schedule 13.10.2008
comment
Для непосвященных это большое количество (2 ^ 32 - 1) файлов. - person meatspace; 08.01.2015

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

person Brian Knoblauch    schedule 13.10.2008
comment
Вы уверены, что это NTFS (дисковый протокол на сервере), а не SMB (сетевой уровень)? - person MSalters; 13.10.2008
comment
Нет, я не проводил дальнейших исследований, чтобы сузить причину. Единственная информация, которая у меня есть, подробно описана выше. - person Brian Knoblauch; 10.09.2012

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

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

person Constantin    schedule 13.10.2008

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

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

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

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

Лучше всего попытаться избежать этой ситуации.

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

person ximik    schedule 14.03.2017
comment
Я не уверен, откуда вы взяли, что MFT можно проходить только последовательно? MFT содержит B-дерево и рассматривается как B-дерево. - person phuclv; 15.08.2018