Чи зберігаються файли на диску послідовно?


22

Як я зрозумів, "розріджений файл" означає, що файл може мати "прогалини", тому фактично використовувані дані можуть бути меншими за розмір логічного файлу.

Як файлові системи Linux зберігають файли на диску? Мене в основному цікавлять ext4. Але:

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

Ви можете прочитати ext4.wiki.kernel.org/index.php/Main_Page
roaima

1
Можливо, якщо я правильно зрозумів ваш намір, вас би більше зацікавив API нижчого рівня, де ви працюєте із пристроями зберігання даних, не маючи пройти через рівень файлової системи. Тоді вашою вхідною точкою може бути dmsetupпрограма, інтерфейс до картографічного пристрою пристроїв. Це може бути вдалим вибором, якщо ви плануєте сховище в базі даних.
wvxvw

4
Це деталь реалізації файлової системи. Майже всі файлові системи роблять файли фрагментів за замовчуванням; тільки iso9660і romfsне здатні на це і вимагають постійного зберігання (з них я можу перерахувати поза головою).
mirabilos

2
незалежно від того, чи є файл на диску на постійному рівні чи ні, дані для читання / запису завжди будуть суміжними, якщо ви не шукаєте іншу частину файлу. То чому ти переймаєшся цим? Якщо лише фрагментація не є серйозною проблемою, яка впливає на продуктивність
phuclv

3
@hudac Одне, що потрібно пам’ятати, це те, що суміжне не все корисне на практиці. Найпростішим є спалах, коли фрагментація не є великою справою, але на спінінг-платформі ви все одно не отримаєте користі від суміжних даних. На обертовій тарілці потрібно подумати про свої схеми доступу та де дані. Якщо вам потрібен сектор, який щойно пройшов під головою, вам доведеться чекати, коли він знову повністю вийде. Для отримання найкращих результатів потрібно розмістити дані так, щоб вони були «близькими», коли їх потрібно прочитати. Збільшення розміру кешу простіше ;-)
Укко

Відповіді:


41

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

Так; це відоме як фрагментація файлів і не рідкість, особливо для великих файлів. Більшість файлових систем виділяють простір у міру необхідності, більш-менш послідовно, але вони не можуть здогадатися про майбутню поведінку - тому якщо ви запишете 200MiB у файл, а потім додасте ще 100MiB, є ненульовий шанс, що обидва набори даних зберігатись у різних областях диска (в основному будь-яке інше записування, що потребує більше місця на диску, яке відбувається після першого запису і до другого, може входити між двома). Якщо файлова система близька до повної, ситуація зазвичай буде гіршою: можливо, не буде суміжного простору вільного простору, достатньо великого, щоб вмістити новий файл, тому його доведеться фрагментувати.

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

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

Чи діє вона по-різному між різними типами?

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


1
Чи буде використання fallocate(3)забезпечення послідовності файлів? чи просто натякне файлова система? Я не можу повністю зрозуміти це зі сторінок man.
худак

6
Він не може забезпечити послідовний розподіл, це лише натяк. Але ви обов'язково повинні використовувати його, якщо ви пишете файли 10GiB!
Стівен Кітт

6
По суті, всі файлові системи, більш досконалі, ніж FAT, - це йде повністю до оригінального UFS Berkeley - навмисно розбиває великі файли та розповсюджуватиме їх на кілька "груп розподілу"; це допомагає їм мінімізувати загальну фрагментацію диска. Там може бути спосіб , щоб налаштувати , як це працює, але є хороші шанси , ви повинні відновити файлову систему з нуля, щоб зробити це, і , ймовірно, не спосіб перетворити його повністю вимкнути.
zwol

2
@hudac Неможливо гарантувати послідовність у всіх випадках (див. випадок із накопичувачем, близьким до повної), а якщо бути чесним із зростанням SSD, це має значення менше, ніж раніше (для тих, хто може собі їх дозволити ).
Мюзер

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системний виклик, це робиться швидко, виділяючи блоки та позначаючи їх як неініціалізовані, не вимагаючи IO для блоків даних. Це набагато швидше, ніж створити файл, заповнивши його нулями.

Як і в Linux Kernel v2.6.31, fallocateсистемний виклик підтримується файловими системами btrfs, ext4, ocfs2 та xfs.

Це послідовно? Спочатку система спробує розподілити блоки послідовно. Якщо він не може, він не попередить вас.


Що таке тип 'ef53'. Я бачив це також у своїх файлах. Але мій тип FS є ext4.
худак

2
EF53 - число "SUPER_MAGIC" ext2, ext3 та ext4. Подивіться "включити / uapi / linux / magic.h" у джерела ядра для всіх магічних чисел кожної файлової системи.
Vouze

На Debian filefragприховано в /usr/sbin. Але це, здається, працює для звичайних користувачів (принаймні, на ext4). Його роботі може бути повчальним, щоб straceдізнатися, як виміряти фрагментацію для себе, якщо відсутність попередження є для вас перешкодою.
Toby Speight

6

Ви згадуєте розріджені файли, і жоден з інших відповідей не згадував їх.

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

Однак вам дозволяється сказати "перемістіться до позиції 1 000 000 000 000 і напишіть там байт". Це створить файл, який виглядає так, що він є етабайт великим, але насправді на диску використовується лише (мабуть) 4k. Це розріджений файл.

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

Хоча це може бути корисно, є два мінуси.

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

Друге - не всі програми добре обробляють ці файли. Наприклад, якесь програмне забезпечення для резервного копіювання спробує створити резервну порожнечу і тим самим створити резервну копію, яка набагато більша, ніж потрібно, можливо, занадто велику для середовища резервного копіювання.


Але навіть нерозріджений файл часто не буде суміжним на диску.
Вармар

2

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

Існує хоча б пара способів цього досягти.

  1. Використовуйте файлову систему з великою кількістю вільного місця та попередньо розподіліть простір (наприклад, використовуйте спеціальний маркер кінцевих даних для програми та додайте випадкові дані, поки розмір файлів не досягне 10 Гб). Це не гарантує отримання нефрагментованих даних.

  2. Використовуйте сировинну (неочищену) файлову систему замість ext4 і т.д. СУБД іноді роблять це з міркувань продуктивності. Компроміс - це ви повинні зробити власне кешування / керування / відновлення тощо при необхідності.

Випадки, коли ви отримуєте багато від цього, порівняно рідкі - я спершу заглянув би в інше місце, щоб оптимізувати продуктивність.


Дивись також

Чи правда, що системи управління базами даних зазвичай обходять файлові системи?


-1

Якщо це лише разова річ і не важливо, як файл зберігається спочатку, важливий лише результат, тоді ви можете просто зберегти файл, а потім запустити дефрагментатор вашої операційної системи. Потім ви можете перевірити цю відповідь, чи ваш файл знаходиться в одному фрагменті, якщо ні, повторіть. Це найпростіший спосіб зробити це, не використовуючи команди чи зовнішні програми, але це, звичайно, не найшвидший метод, оскільки він знеструмлює весь ваш диск.


1
"Запустити дефрагментатор"? Чи є така програма? Єдине, що було знайдено, коли я шукав, aptitude search ~ddefrag- ddrescueviewце nidsбібліотека перекомпонування сегмента TCP. Ваша відповідь не дуже корисна, якщо ви не говорите, як називається програма чи які аргументи потрібно передавати.
Toby Speight

1
@TobySpeight - так, є дефрагментатор; e4defrag.
ravery
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.