У нас есть приложение, которое планирует хранить около 1,1 ТБ XML-файлов, средний размер которых составляет 8,5 КБ.
Это данные за 18 месяцев, при этом каждый день создается около 200 000 новых файлов.
Каждый файл будет записан только один раз, а затем с вероятностью 3% будет прочитан небольшое количество (<10) раз в течение следующих 18 месяцев.
Какие варианты NTFS доступны для нас, которые помогут с производительностью?
Текущие в нашем списке:
Что касается фрагментации: мы планируем использовать кластеры размером 2k для более эффективного использования дискового пространства. Каждый файл будет записан только один раз (т.е. файл не редактируется). Файлы будут удаляться через 18 месяцев ежедневно.
Поэтому мы не считаем, что фрагментация станет серьезной проблемой.
Отключите отметку времени последнего доступа и зарезервируйте место для MFT.
Еще бы добавил:
Отключите дефрагментацию диска. Измените размер блока на 16 КБ, чтобы каждый файл записывался в один блок.
Рационально для этого:
Вы хотите записывать 1,7 ГБ данных в день в 200 000 файлов. Предполагая, что эти файлы записываются в течение 24 часов, это означает около 3 файлов в секунду. Это не кажется серьезной проблемой для одного диска SATA, поэтому я предполагаю, что у вас есть другие проблемы, кроме производительности диска.
(т.е. у вас достаточно памяти? или вы тоже выгружаете память на диск?)
тем не мение
Файловые системы Windows NTFS по умолчанию пытаются дефрагментировать файловые системы в фоновом режиме. Дефрагментация диска снижает производительность, пока вы выполняете дефрагментацию диска. Поскольку производительность, похоже, уже является проблемой, это только ухудшит ваше положение.
Существует баланс между использованием кластеров небольшого размера и производительностью ввода-вывода при записи больших файлов. Файлы и таблица размещения файлов не будут находиться в одном секторе на диске, поэтому необходимость выделения блоков во время записи файлов приведет к тому, что головка диска будет постоянно перемещаться. Использование размера кластера, позволяющего хранить 95% ваших файлов в одном кластере каждый, улучшит производительность записи ввода-вывода.
Как отмечали другие люди, использование крошечного кластера размером 2k со временем вызовет фрагментацию. Подумайте об этом так: в течение первых 18 месяцев вы будете записывать файлы на чистый пустой диск, но ОС не знает, что после закрытия к каждому файлу больше не будут добавляться данные, поэтому некоторые блоки оставались доступными в заканчивать каждый файл, если позже этот файл будет расширен. Задолго до того, как вы заполните диск, вы обнаружите, что единственное свободное пространство находится в промежутках между другими файлами. Мало того, что при выборе промежутка для вашего файла операционная система не знает, пишете ли вы файл из 5 блоков или файл из 2 блоков, поэтому она не может сделать правильный выбор, где сохранить файл.
В конце концов, проектирование - это решение противоречивых потребностей и выбор наиболее дешевого решения для удовлетворения этих потребностей. Я предполагаю, что покупка жесткого диска большего размера, вероятно, дешевле, чем покупка более быстрых жестких дисков.
Чтобы подробнее рассказать о моем комментарии к ответу Птолемея ...
Устанавливая размер блока так, чтобы большая часть каждого файла содержалась в одном блоке, вы действительно получаете эффективность ввода-вывода. При размере блока 2 КБ и среднем размере файла 8,5 КБ 50% ваших операций ввода-вывода будут приходиться на 5 или более блоков. При установке размера блока 16 КБ создается впечатление, что очень большая часть операций записи будет производиться в один блок; что сделало бы эти 3% чтения намного более эффективными, когда они произойдут.
Одна вещь, которую следует учитывать, - это резервный ввод-вывод. Если вы выполняете резервное копирование данных, каждый файл будет прочитан хотя бы один раз, а их записи в каталоге будут отслеживаться при каждом проходе резервного копирования. Если вы собираетесь сделать резервную копию этого, пожалуйста, подумайте о резервном вводе-выводе в своих проектах.
Предостережения: если ваша нижележащая система хранения уже выполняет некоторую виртуализацию хранения (например, дисковый массив HP EVA или другие массивы этого класса), то это не имеет большого значения. Фрагментация этого типа не будет заметна, поскольку данные уже физически существуют в сильно фрагментированном виде на реальных дисках. В этом случае размер блока 2k вполне подойдет и не так сильно повлияет на производительность. Производительность все равно будет расти, если выбрать размер блока, достаточно большой, чтобы вместить большинство ожидаемых размеров файла, но величина не будет столь значительной.
Поздно для этой вечеринки, но может принести пользу другим, так что ...
Re. размер кластера, в первую очередь и самое главное, вам нужно будет посмотреть на распределение размеров файлов, чтобы вы могли оптимизировать как для низкой фрагментации и тратится дисковое пространство, поэтому вы должны изменять размер кластеров, близких к этому размеру, а не к общему среднему - например: если размер большинства файлов составляет около 2 КБ, размер кластера 2 КБ будет оптимальным, если около 4 КБ, то кластер 4 КБ будет оптимальным и т. ; если размеры файлов otoh распределены равномерно / случайным образом, то лучшее, что вы могли бы сделать, - это выбрать размер файла, близкий к среднему для размера кластера, или хранить файлы в разделах с разными размерами кластера для разных размеров файлов, как это делают некоторые более крупные системы, но вы ' Для этого мне нужна поддержка программного обеспечения / fs.
Вы также можете изучить RAID для своего дизайна. Существуют различные формы RAID, но вам следует изучить RAID 5, который позволит вам записывать файлы на разные диски одновременно, но данные все равно будут на одном томе ... Это дает вам несколько преимущества:
1) Вы создаете резервную копию по ходу работы. Это позволяет получить сбой диска, и вы можете восстановить его. RAID 1 будет создавать зеркальную копию, но 5 включает чередование - RAID 1 даст вам только преимущество этой резервной копии ... хотя 5 будет более задействовано, и вам потребуется больше дисков для его настройки (минимум 3, по сравнению с 2, необходимых для RAID 1), у вас есть другие преимущества.
2) Чередование также увеличивает производительность, поскольку вы можете записывать несколько файлов одновременно (по оценкам, 3 в секунду, выше ...), чередование позволит файлам «распределяться» по дискам, и каждый диск принимает только часть бремени. Чем больше дисков задействовано, тем меньше нагрузка на каждый диск, но будет момент, когда вы достигнете предела производительности по сравнению с затратами ...
3) Если вы создаете резервную копию данных, резервное копирование может выполняться без снижения производительности записи - конечно, в зависимости от размера кеша дисков и формы резервного копирования ... но по большей части вы бы не Не нужно выключать, чтобы вызвать резервное копирование.
Кроме того, то, как вы настроили систему, даже звучит так, как будто резервное копирование было бы проще для вас - вам нужно создавать резервные копии данных за 24 часа за раз, поскольку файлы не изменяются позже. Вы даже можете написать пакетное задание, которое сжимает данные, если вас беспокоит пространство, занимаемое файлами ... XML - это в основном текст, поэтому коэффициенты сжатия будут высокими, а распаковка потребуется редко, всего на 3%. файлов ... чтобы вы могли включить сжатие на диск, не опасаясь времени декомпрессии. Это также уменьшило бы необходимые размеры блоков и могло бы еще больше повысить эффективность системы, поскольку ЦП участвует в сжатии данных, а не просто является их посредником. (IE, если бы все, что вы делали, это хранили данные, это было бы пустой тратой того прекрасного процессора ЦП в этой системе ... но если бы он использовал «потраченные впустую» тактовые циклы, сжимая данные и более эффективно распределяя их по дискам, тем лучше!)
При сжатии ваши блоки размером 2 КБ, вероятно, без проблем будут содержать ваши файлы 8,5 КБ. Добавьте чередование и резервное копирование RAID, а также здоровенный процессор, достаточно памяти, чтобы не кэшировать какие-либо запущенные программы (если какой-либо кеш вообще используется), и вы на правильном пути к хорошей системе для того, что вы хотите сделать.
Это простая утилита для увеличения производительности NTFS путем отключения некоторых функций NTFS, которые сейчас не так используются (или не так важны).
https://gist.github.com/p3x-robot/185e5c1b699d726bcce1bb51d5ca82d8
rem execute as an Administrator
rem based on http://www.windowsdevcenter.com/pub/a/windows/2005/02/08/NTFS_Hacks.html
ram based on https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc938961(v=technet.10)
rem http://archive.oreilly.com/cs/user/view/cs_msg/95219 (some installers need 8dot3 filenames)
rem disable 8dot3 filenames
ram Warning: Some applications such as incremental backup utilities rely on this update information and do not function correctly without it.
fsutil behavior set disable8dot3 1
rem increase ntfs mtz size
fsutil behavior set mftzone 2
rem disable last access time on all files
fsutil behavior set disablelastaccess 1
echo now you can reboot