Сохраняются ли файлы на диске последовательно?

22

Как я понял, «разреженный файл» означает, что файл может иметь «пробелы», поэтому фактически используемые данные могут быть меньше, чем логический размер файла.

Как файловые системы Linux сохраняют файлы на диске? Я в основном заинтересован в ext4. Но:

  1. Можно ли сохранить файл не последовательно на диске? Под этим я подразумеваю, что часть файла расположена по физическому адресу X, а следующая часть - по физическому адресу Y, который не близок к смещению X +).
  2. Можно ли как-то контролировать последовательность файлов?
    Я хочу выделить файл 10 ГБ. Я хочу, чтобы он был последовательным на диске и не распределялся между разными смещениями.
  3. Это действует по-разному между различными типами?
hudac
источник
Возможно, вы захотите прочитать ext4.wiki.kernel.org/index.php/Main_Page
roaima
1
Возможно, если я правильно понимаю ваше намерение, вас больше заинтересует низкоуровневый API, где вы работаете с устройствами хранения без необходимости проходить через уровень файловой системы. Тогда вашей точкой входа может быть dmsetupпрограмма, интерфейс для отображения устройств. Это может быть хорошим выбором, если вы планируете хранилище в виде базы данных.
wvxvw
4
Это деталь реализации файловой системы. Почти все файловые системы делают файлы фрагментов по умолчанию; только iso9660и romfsнеспособны сделать это и требуют постоянного хранения (из них я могу перечислить вне головы).
Мирабилось
2
независимо от того, является ли файл непрерывным на диске или нет, чтение / запись данных всегда будет непрерывным, если только вы не выполните поиск другой части файла. Так почему вы заботитесь об этом? Если фрагментация не является серьезной проблемой, которая влияет на производительность
phuclv
3
@hudac Следует иметь в виду, что смежность не так уж полезна на практике. Самый простой - это флэш, где фрагментация не имеет большого значения, но на вращающемся блюде вы все равно не сможете извлечь пользу из непрерывных данных. На вращающемся блюде вам нужно подумать о ваших схемах доступа и о том, где находятся данные. Если вам нужен сектор, который только что прошел под головой, вы должны подождать, пока он снова не появится полностью. Чтобы получить наилучшие результаты, вы хотите разбить данные так, чтобы они были «близки», когда их нужно прочитать. Увеличение размера кэша проще ;-)
Ukko

Ответы:

41

Можно ли сохранить файл не последовательно на диске? Я имею в виду, что часть файла находится под физическим адресом X, а другая часть - под физическим адресом Y, который не близок к смещению X +).

Да; это известно как фрагментация файла и не редкость, особенно для больших файлов. Большинство файловых систем выделяют пространство по мере необходимости, более или менее последовательно, но они не могут угадать будущее поведение - поэтому, если вы записываете 200 МБ в файл, а затем добавляете дополнительные 100 МБ, существует ненулевая вероятность того, что оба набора данных будут храниться в разных областях диска (в основном, любая другая запись, требующая больше места на диске, происходящая после первой записи и перед второй, может оказаться между ними). Если файловая система близка к полному, ситуация обычно будет хуже: может не быть смежной области свободного пространства, достаточно большой для размещения нового файла, поэтому ее придется фрагментировать.

Можно ли как-то контролировать последовательность файлов? Я хочу выделить большой файл 10 ГБ. Я хочу, чтобы он был последовательным на диске и не разделялся между различными смещениями.

Вы можете сообщить файловой системе о целевом размере вашего файла при его создании; это поможет файловой системе оптимально хранить ее. Многие современные файловые системы используют метод, известный как отложенное размещение, при котором макет нового файла на диске рассчитывается как можно позже, чтобы максимизировать доступную информацию при выполнении вычисления. Вы можете помочь этому процессу, используя posix_fallocate(3)функцию, чтобы сообщить файловой системе, сколько дискового пространства должно быть выделено в общей сложности. Современные файловые системы будут пытаться выполнить это распределение последовательно.

Это действует по-разному между различными типами?

Разные файловые системы ведут себя по-разному, да. Файловые системы на основе журналов, такие как NILFS2, не распределяют хранилище так же, как файловые системы на основе экстентов, такие как Ext4, и это только один из вариантов вариаций.

Стивен Китт
источник
1
Будет ли использование fallocate(3)обеспечить последовательность файлов? или просто намекает на файловую систему? Я не могу полностью понять это на страницах руководства.
hudac
6
Это не может гарантировать последовательное распределение, это просто подсказка. Но вы обязательно должны использовать его, если вы пишете файлы 10 ГБ!
Стивен Китт
6
По сути, все файловые системы, более сложные, чем FAT, - вплоть до оригинальной UFS Беркли - намеренно разбивают большие файлы и распределяют их по нескольким «группам размещения»; это помогает им минимизировать общую фрагментацию диска. Там может быть способ , чтобы настроить , как это работает, но есть хорошие шансы , вы должны восстановить файловую систему с нуля, чтобы сделать это, и , вероятно, не способ превратить его полностью выключить.
zwol
2
@hudac Невозможно гарантировать последовательность во всех случаях (см. пример с накопителем, который близок к заполнению), и, честно говоря, с ростом количества твердотельных накопителей это имеет меньшее значение, чем раньше (для тех, кто может себе их позволить по крайней мере). ).
Музер
1
Также обратите внимание, что существуют ситуации, такие как системы RAID, где наличие смежных файлов менее эффективно, если это вообще возможно. Я думаю, что это действительно цель контроллера дисковой подсистемы хранения: разгрузить всю работу по хранению файлов настолько оптимально, насколько это можно разумно ожидать.
jamesqf
17

Команда filefragрасскажет вам, как ваш файл физически хранится на вашем устройстве:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

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

Страница справочника fallocate(1) довольно понятна:

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

Начиная с Linux Kernel v2.6.31, fallocateсистемный вызов поддерживается файловыми системами btrfs, ext4, ocfs2 и xfs.

Это последовательно? Система сначала попытается распределить блоки последовательно. Если он не может, он не предупредит вас.

Vouze
источник
Что такое тип 'ef53'. Я видел это также на моих файлах. Но мой тип FS есть ext4.
hudac
2
EF53 - это число «SUPER_MAGIC» для ext2, ext3 и ext4. Посмотрите в "include / uapi / linux / magic.h" в исходных кодах ядра все магические числа каждой файловой системы.
Вауз
На Debian filefragскрыт в /usr/sbin. Но это похоже на работу для обычных пользователей (по крайней мере, на ext4). Для straceего работы может быть полезно посмотреть, как измерить фрагментацию для себя, если отсутствие предупреждения является помехой для вас.
Тоби Спейт
6

Вы упоминаете разреженные файлы, и ни один из других ответов не упомянул их.

Большинство файлов не редки. Самый распространенный способ создания файла - это написать все сразу, от начала до конца. Там нет дыр.

Тем не менее, вы можете сказать «переместиться на позицию 1,000,000,000,000 и записать там байт». Это создаст файл, который выглядит так, как будто он имеет большой размер в etabyte, но на самом деле использует только (вероятно) 4 КБ на диске. Это редкий файл.

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

Хотя это может быть полезно, есть два недостатка.

Во-первых, файл будет фрагментирован, о чем вы и беспокоитесь.

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

Стиг Хеммер
источник
Но даже не разреженный файл часто не будет непрерывным на диске.
Бармар
2

Можно ли как-то контролировать последовательность файлов? Я хочу выделить файл 10 ГБ. Я хочу, чтобы он был последовательным на диске и не распределялся между разными смещениями.

Есть по крайней мере несколько способов добиться этого.

  1. Используйте файловую систему с большим количеством свободного места и предварительно выделите пространство (например, используйте специфичный для приложения маркер конца данных и добавляйте случайные данные, пока размер файла не достигнет 10 ГБ). Это не гарантирует получение нефрагментированных данных.

  2. Используйте сырую (сырую) файловую систему вместо ext4 и т. Д. СУБД иногда делают это по соображениям производительности. Компромисс заключается в том, что вы должны сделать свое собственное кэширование / журналирование / восстановление и т.д., если это необходимо.

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


Смотрите также

Правда ли, что системы управления базами данных обычно обходят файловые системы?

RedGrittyBrick
источник
-1

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

Фабиан Релинг
источник
1
«Запустить дефрагментатор»? Есть ли такая программа? Единственное , что нашел , когда я искал с aptitude search ~ddefragбыли ddrescueviewи nidsсегмент TCP повторной сборки библиотеки. Ваш ответ не очень полезен, если вы не говорите, как называется программа или какие аргументы необходимо передать.
Тоби Спейт
1
@TobySpeight - есть дефрагментатор; e4defrag.
Ревери