Будут ли блоки недавно созданного впоследствии удаленного файла когда-либо записываться обратно на диск?

Предположим, у меня есть процесс, который создает файл, записывает в него какие-то данные, а затем после небольшой обработки (самостоятельно или другим процессом) удаляет его и закрывает все оставшиеся файловые дескрипторы.

Я предполагаю, что оперативной памяти достаточно для хранения страниц в памяти до тех пор, пока файл не будет удален, и что в это время никто не вызывает sync().

Будут ли блоки уже удаленного файла когда-либо записаны обратно на диск или они будут немедленно удалены из грязного списка?

Или это зависит от файловой системы? Файловые системы, такие как xfs и ext4, имеют «отложенное выделение», которое может поддерживать эту функцию, если она реализована.


person MarkR    schedule 01.04.2009    source источник


Ответы (4)


Я согласен с Джонатаном Леффлером, но не только в отношении классических файловых систем Unix: на аналогичную тему было обсуждение файловой системы ext4.

В комментарии Теодор Ц. 'o (один из основных разработчиков файловой системы ext4) утверждает: "...например, если вы создадите рабочий файл, а затем удалите его через 20 секунд, он, вероятно, никогда не попадет на диск".

person Jochen Walter    schedule 13.04.2009
comment
Спасибо, это первый ответ, который действительно правильно отвечает на мой вопрос. - person MarkR; 13.04.2009

В классических файловых системах Unix ответ был бы «Нет» (то есть данные для созданного и удаленного файла не обязательно попадут на диск), хотя некоторые метаданные каталога (время модификации), вероятно, все же изменятся. Следовательно, происходящее частично зависит от используемой файловой системы.

Обратите внимание, что даже вызов sync() не гарантирует, что они будут записаны; он только планирует запись данных обратно на диск. Отсюда древнее предписание дважды вводить команду sync перед остановом системы — это давало компьютеру достаточно времени для завершения записи, потому что он может записывать на диск быстрее, чем вы дважды набираете sync (особенно если вы используете настоящий компьютер). Телетайп со скоростью 110 бод).


Стандарт POSIX говорит (о функции sync(), которая используется командой sync):

Функция sync() должна запланировать запись всей информации в памяти, которая обновляет файловые системы, во все файловые системы.

Запись, хотя и запланированная, не обязательно завершается по возвращении из sync().

Если Linux изменил свое определение, чтобы гарантировать, что «все данные записываются на диск», то это правильное и полезное расширение. Но это не классическое поведение — и остерегайтесь переноса опыта Linux на другие системы.

Есть и другие функции, такие как fsync(), которые дают другие, более строгие обещания:

Функция fsync() должна запросить, чтобы все данные для дескриптора открытого файла, названного fildes, были переданы на устройство хранения, связанное с файлом, описанным fildes. Характер передачи определяется реализацией. Функция fsync() не должна возвращаться до тех пор, пока система не завершит это действие или пока не будет обнаружена ошибка.

И есть варианты файловых дескрипторов, которые опять дают другие обещания: O_SYNC, O_DSYNC, O_RSYNC. Найдите их в стандарте POSIX (open()).

person Jonathan Leffler    schedule 01.04.2009
comment
Я не совсем уверен, что это отвечает на вопрос. Под Linux синхронизация утверждает, что фактически ждет завершения записи. Кроме того, в современной системе у вас может быть гораздо больше грязных данных, чем система может записать, пока я набираю sync. - person MarkR; 01.04.2009
comment
Это не тот случай, когда синхронизация гарантирует, что данные были записаны, но вторая синхронизация на самом деле бесполезна, а просто дает временное окно для записи собственного кеша жесткого диска на пластины ? - person snemarch; 01.04.2009
comment
Я до сих пор не уверен, что это как-то связано с моим вопросом: если файл записывается, читается, а затем удаляется БЕЗ вызова синхронизации (или fsync), он вообще записывается на диск? Я не знаю ответа. - person MarkR; 02.04.2009
comment
@MarkR: Мой ответ на ваш вопрос: это зависит от файловой системы и рабочей нагрузки на машину, но в классических системах данные файла не обязательно попадают на диск. С журналируемой файловой системой я не уверен, попадут ли данные на диск, но, вероятно, да (догадка). - person Jonathan Leffler; 02.04.2009
comment
@MarkR: материал под строкой был скорее ответом на комментарий @snemarch, указывающий, что POSIX не требует системного вызова sync(), чтобы гарантировать, что все данные будут записаны на диск к моменту их возврата. - person Jonathan Leffler; 02.04.2009

Я провел небольшое исследование и обнаружил, что в Linux это действительно зависит от файловой системы.

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

Я подозреваю, что это делают и «современные» файловые системы Linux (ext4, btrfs). Это хорошо.

person MarkR    schedule 13.09.2009

Что вам действительно нужно знать, здесь?

Если вопрос "будет ли он, вероятно, записан на диск?" ответ — нет, если ваша обработка краткая, но без обещаний.

Если вопрос "могу ли я быть уверен, что он не будет записан на диск?" ответ тоже нет. Удаленный файл является таким же файлом, как и любой другой, пока он остается открытым; это просто файл без названия (ссылка).

Если ответ "это полностью бесплатно с точки зрения диска?" ответ снова нет - например, я почти уверен, что в системе с квотами количество «блоков» в файле будет взиматься с квоты файловой системы пользователя, как только вы их записываете.

person hobbs    schedule 13.09.2009
comment
Я пытался определить, вызывают ли кратковременные временные файлы нагрузку ввода-вывода на загруженных машинах, и если да, то есть ли подход, который это исправляет; ответы кажутся да и да соответственно (используйте файловую систему, которая поддерживает отложенное выделение). - person MarkR; 14.09.2009