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

183

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

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

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

Джеймс Ньютон-Кинг
источник
Ответы на соответствующий вопрос уступают принятому ответу здесь.
Эрик Дж.
Эта реализация может быть полезной: github.com/acrobit/AcroFS
Ghominejad

Ответы:

271

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

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

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

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

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

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

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

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

СМО
источник
5
Где я могу найти больше информации о contig.exe, это не на моем сервере. Поиск Google возвратил эту техническую страницу, где нет упоминаний о подкаталогах или дефрагментации индекса папки.
Эван Кэрролл
35
Я узнал о фрагментации индекса contig & folder от технического звонка инженера Microsoft. Это была огромная боль в заднице, проходящей через их бесполезные уровни технической поддержки 1-3 уровня. (Э-э ... вы пробовали запустить chkdsk? Можете ли вы открыть папку в проводнике Windows? Можете ли вы проверить права доступа к папке?) FOOL! Я не собираюсь сидеть здесь в течение 7 дней, ожидая, пока ваш чертов chkdsk отсканирует диск с десятками миллионов файлов !!
MrB
5
@ ss2k - Просто укажите contig.exeна каталог, я думаю, что он сделает работу: contig -a .дает:C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file
Lumi
3
@GPhilo Я могу подтвердить, что производительность SSD все еще падает при использовании миллионов файлов. Я также попытался дефрагментировать папку, но Контиг ничего с этим не сделал. Он действовал так, как будто завершился, но показал одинаковую фрагментацию до и после запуска.
Брэм Ванрой
1
С точки зрения запуска Contig для дефрагментации индекса, следует ли мне запускать contig c:\my\big\directory, или c:\my\big\directory\*, или дальше $mft? (или что-то еще?)
Стивен Р.
47

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

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

Тони Ли
источник
3
Я бы добавил цитату здесь 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» (= здесь нет необходимости в буфере обмена)
Wolf
32

Я создаю файловую структуру для размещения до 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 может обрабатывать большие #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; 
}
СПОК
источник
2
Вы видите снижение производительности после 2 ^ 8 файлов, потому что вам нужно отключить генерацию коротких имен (генерация имен из 8 символов). См. Technet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx
Кайл Фалконер
1
Привет, я пытался, используя эту командную строку: поведение fsutil.exe установить disable8dot3 1 После перезагрузки результаты были в основном одинаковыми для менее чем 10000 файлов / каталогов. В статье говорится, что это важно только для больших чисел. Но то, что я увидел, было обычным перфомансом. возможно, ухудшение из-за более высокого коэффициента загрузки моего SSD (теперь он заполнен на 80% вместо 45%)
Spoc
очень полезно, спасибо. Оценки миллионов, сказанные другими пользователями, далеки от этих числовых значений.
Адриан Мэр
2
Даже после отключения генерации имени 8.3 вам все равно нужно удалить существующие имена 8.3, иначе перечисление существующих файлов будет незначительным.
Стивен Р.
2
более подробная информация: blogs.technet.microsoft.com/josebda/2012/11/13/…
Стивен Р.
15

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

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

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

Oli
источник
5
Для непосвященных это большое количество (2 ^ 32 - 1) файлов.
мясное пространство
8

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

Брайан Кноблаух
источник
4
Вы уверены, что это NTFS (протокол диска на сервере), а не SMB (сетевой уровень)?
MSalters
Нет, я не проводил дальнейших исследований, чтобы сузить причину. Единственная информация, которая у меня есть, как указано выше.
Брайан Кноблаух
2

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

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

Constantin
источник
1

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

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

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

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

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

Для ваших собственных программ, использующих BLOB-объекты без любой fs, может быть полезным. Это то, что делает Facebook для хранения фотографий.

Ximik
источник
Я не уверен, откуда вы взяли, что «MFT может проходить только последовательно»? MFT содержит B-дерево и пересекается как B-дерево
phuclv