Недостаточно места на диске NTFS после серии создания / удаления файлов одинакового размера - PullRequest
2 голосов
/ 25 августа 2010

Я столкнулся с действительно странной проблемой, работая над большим проектом.Я записываю кучу файлов одинакового размера на раздел (пробовал как RAM-диски, так и виртуальные диски, созданные с помощью diskmgmt.msc).Когда свободного места недостаточно для размещения другого файла (как сообщает GetDiskFreeSpaceExW), я удаляю один (только один) из ранее созданных и записываю новый.Затем я удаляю другой старый файл и записываю новый, до бесконечности (так что вы можете думать о разделе как о кольцевом буфере файлов одинакового размера).После серии операций записи-удаления (от нескольких сотен до нескольких тысяч) я сталкиваюсь с ошибкой no free space при записи нового файла (до этого GetDiskFreeSpaceExW сообщает о достаточном количестве места).Я попросил нескольких моих коллег попытаться воспроизвести проблему на их оборудовании, но проблема не всплыла.

Чтобы прояснить ситуацию немного, вот точный алгоритм:

  1. Выберите размер файла (скажем, S байт)
  2. Проверьте свободное место с помощью GetDiskFreeSpaceExW
  3. Если free_space> S: запишите новый файл размера S и перейдите к 2
  4. Остальное: удалить один файл и перейти к 2

Важно отметить, что я записываю данные в файлы в блоках размером 4096 байт (проблема может или не может всплыть в зависимости от размера блока).Размер файла составляет 5 МБ.Размер раздела NTFS составляет 21 МБ.Размер кластера составляет 512 В (опять же, изменение этих параметров влияет на результаты).С этими параметрами происходит сбой при создании 684-го файла.Это не зависит от того, использую ли я RAM-диск или виртуальный диск (следовательно, это не проблема конкретной реализации).

Я проанализировал полученные дампы образа диска после сбоя и обнаружил, чтофайлы были сильно фрагментированы.Чкдск не сообщает о проблемах ни до, ни после эксперимента.В системных журналах ошибок не обнаружено.

Возможные параметры моего нетбука (Dell Inspiron 1110):

  • Pentium SU4100, относительно медленный двухъядерный x64 CULV CPU (1,3 ГГц))
  • Windows 7 Ultimate x64 edition
  • 2 ГБ ОЗУ

Кто-нибудь имеет представление о том, что происходит и как его отладить?Где я могу найти дополнительную информацию?У меня уже нет идей, и мне нужно решить эту проблему как можно скорее ...

UPD: проблема возникает, когда я пишу данные файла (т.е. write() терпит неудачу), не , когда я создаю файл.Так что, похоже, мне не хватает записей MFT.

UPD2: , отвечая на несколько вопросов, которые были заданы

  • Разделтолько что отформатированный, следовательно, никаких специфических атрибутов для файлов, никакой структуры каталогов, ничего
  • Разрешения по умолчанию
  • Нет .lnk's, нет жестких ссылок - _только_ файлы, которые я пишу
  • Все файлы записываются в корневой каталог, каталоги больше не создаются
  • Имена файлов - это просто порядковые номера файлов (т. Е. 1, 2, 3, ...)
  • Нет альтернативных данныхпотоки, файлы создаются с помощью `fopen ()`, записываются с помощью `fwrite ()` и закрываются с помощью `fclose ()`
  • $ Txf создается, действительно
  • Нет плохих кластеров,это виртуальный (или RAM) диск

Ответы [ 4 ]

1 голос
/ 25 августа 2010

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

По умолчанию Windows XP резервирует 12,5 процента каждого тома NTFS (область, называемая зоной MFT) для эксклюзивное использование MFT. Так что если вы планирую хранить тонны маленьких файлов (до 8K, скажем) на вашем объеме, ваш MFT может закончиться до вашего свободное пространство тома, и результатом будет фрагментация MFT.

С Technet

Во-первых, MFT не сжимается даже при удалении файлов и каталогов от объема; вместо этого MFT отмечает ФРС, чтобы отразить удаление. Во-вторых, NTFS хранит очень небольшие файлы в MFT FRS, которые обратитесь к файлам. Хотя это настройка обеспечивает выигрыш в производительности для этих файлов это может вызвать MFT чрезмерно расти, когда объем содержит много таких файлов.

1 голос
/ 25 августа 2010

Хороший вопрос NTFS и не вся информация здесь. Что такое структура каталогов? Есть ли файлы LINK на этом? Вы используете сжатие на диске? Объемные теневые копии?

Вы не исчерпываете пространство MFT, поскольку существует постоянное количество файлов / каталогов. Это означает, что MFT является статическим. Также резервное пространство MFT будет использоваться в сценариях с ограниченным пространством на диске. Я использовал каждый кластер на томе NTFS.

Есть несколько объяснений того, что происходит:

1) Возможно, файл $ Log вырос. Это журнал отката.

2) Файл @SII для информации о безопасности для файла мог бы увеличиться, если на диске имеются неоднородные разрешения

3) Если некоторые файлы этого тома имеют файлы .lnk / shortcut, указывающие на них, система помещает GUID для каждой цели в индекс. (вы получаете файлы .lnk, если дважды щелкнуть файл в проводнике - в последних документах!)

4) структура каталогов НЕ статична (или имена файлов не одинаковы по длине), размер $ index буферов каталогов может увеличиться в размере.

5) Если на этом диске есть системный том директории, возможно, у вас есть теневые копии томов и другие данные ОС.

6) Альтернативные потоки данных не отображаются в размере файла. Есть ли?

7) TxF - в Vista и выше может существовать транзакционный уровень, занимающий переменное пространство.

8) Плохие кластеры? Кластеры могут выйти из строя (но chkdsk может это заметить ..)

9) Файлы становятся фрагментированными, и список фрагментов alson с другими метаданными слишком велик, чтобы поместиться в запись MFT (маловероятно, если ваши файлы маленькие и у вас нет длинных файлов)

10) Использование жестких ссылок также увеличивает объем данных на диске.

Я перечислил все это как справку для других людей!

Последнее замечание - иногда вы можете создавать и записывать небольшой файл, даже если в нем свободно 0 байт, поскольку резидентные файлы NTFS занимают только запись MFT (они возвращают удаленную бесплатную)

1 голос
/ 25 августа 2010

FS имеет свои накладные расходы, которые вы не учитываете. Эти издержки не постоянны, поэтому, удаляя / записывая файлы, вы можете вызывать фрагментацию. Другими словами, «5 МБ свободного места» не означает, что вы можете записать 5 МБ на диск.

0 голосов
/ 27 августа 2010

Хотя неудивительно, что отключение TXF исправило бы это (TXF - это только один компонент файловой системы, использующий пространство на томе), но следует учитывать две вещи. Во-первых, более того, на самом деле, вы можете быть осторожны с отключением. (Другие компоненты могут зависеть от этого; Центр обновления Windows является одним из таких компонентов, хотя он должен заботиться только о системном томе.)

Еще одна вещь, которую следует учитывать, - это, как правило, хрупкая модель. Файловая система имеет некоторые предположения о том, что она может потреблять. Например, индексы будут расти (с предопределенными приращениями, могут изменяться), и они могут не уменьшаться способами, которые вы считаете предсказуемыми. Кроме того, индекс дескриптора безопасности, вероятно, будет продолжать расти.

Другое замечание выше о теневых копиях - это то, о чем всегда следует помнить.

FWIW Файл $ Log не будет автоматически увеличиваться.

...