Як довго файлова система може кешувати кеш із ext4?


14

Деякий час тому було обговорено питання про те, що ext4 потенційно може залишати порожні файли після нечистого відключення, підсумовані в цій статті досить добре . В основному через затримку розподілу записи можуть зберігатися в кеш-пам'яті записи набагато довший час, ніж інтервал фіксації за замовчуванням журналу ext (5 секунд).

Проблеми, здається, були виправлені в патчі, який змушує блокувати розподіл у певних ситуаціях, тим самим примушуючи дані на диск не пізніше 5 секунд за замовчуванням.

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

Це здається іншою ситуацією, ніж додавання до файлу: при додаванні розмір файлу змінюється, що є зміною метаданих; отже, необхідна фіксація журналу протягом 5 секунд, а через дані = впорядковані, дані доведеться записати до цього через проблеми безпеки (інакше частини видалених файлів інших користувачів можуть з’явитися для власника доданого файл).

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

Оновлення: Я знаю, що все це не має значення, коли ви робите правильно, тобто за допомогою fsync (). (Це було основною причиною всієї дискусії про ext4 та втрату даних - проблема стосувалася лише додатків, які не fsync () ing, або не в потрібні моменти.) Я не пишу власну заявку, я прошу, тому що я не знаю, чи всі мої програми роблять правильно, і я хочу знати приблизний термін для таких "небезпечних" записів. Причина запитання полягає в тому, що мій драйвер графіки регулярно викликає паніку ядра, і я хочу знати, чи потрібно мені турбуватися більше, ніж за останні 5 секунд даних.

Відповіді:


16

Ви можете встановити інтервал фіксації на спеціальне значення, яке, я вважаю, може бути таким же високим, як 32-бітове непідписане ціле число секунд; тобто приблизно 4 мільярди секунд, або 136 років. Це доступно через commitопцію кріплення, яку ви можете ввести в дію наступним чином (це лише приклад; ви також можете встановити це fstab):

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

Інтервал фіксації не ґрунтується на будь-якому типі умов, наприклад, додаються дані чи перезаписуються існуючі дані чи інше. Опція commitкріплення (яка за замовчуванням становить 5 секунд, якщо ви взагалі не надаєте опцію кріплення) еквівалентна виконанню подібного в оболонці bash:

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

Не плутайте data=orderedцей глобальний інтервал синхронізації файлової системи ("інтервал фіксації", мабуть, менш значущий термін для тих із нас, хто розуміє функціональність програми командного рядка sync; у цьому випадку його можна краще назвати "інтервал синхронізації"). data=ordered- це про порядок оновлення даних та метаданих (де data=writeback"менш безпечно / швидше" та data=journal"безпечніше / повільніше"). commit=12345678йдеться про частоту, з якою сам драйвер файлової системи змушує ПОЛУЧУВАТИ синхронізацію ВСІХ брудних даних / журналу / метаданих / що завгодно з фізичними носіями. І ви, безумовно, можете встановити його на 136 років, якщо хочете, і монтуйте data=writeback,nobhпрограми та програми, які не дзвонять fsync()або sync()матимуть брудні сторінки, що сидять у оперативній пам'яті протягом ...

Оновлення: Виходячи з вашого контексту в редагуванні запитання, я б сказав, що вам слід запустити вашу файлову систему з параметрами монтування data=journal,commit=1або навіть з syncопцією монтування, поки ви не зможете вирішити паніку ядра графічного драйвера. Це дозволить зберегти максимальну цілісність даних, але за рахунок продуктивності. Це особливо хочеться зробити це, якщо ви часто записуєте на диск дані, які не можете дозволити собі втратити, і це вдвічі важливо, якщо ви не «довіряєте» програмам, які ви використовуєте для fsync()належного використання .

Джерело: тут і особистий досвід


1
Дякую, "ВСІ брудні дані" було саме те, про що я хвилювався! Мене хвилювало, що крім відкладеного розподілу було більше винятків (що може призвести до того, що нові дані залишаться в кеші запису навіть після інтервалу фіксації).
lxgr

1
Я майже впевнений, що затримка розподілу абсолютно не має значення під час виклику sync(або, що рівно, коли запускається таймер інтервалу фіксації). У той момент, коли syncзавершується, абсолютно немає брудних даних, метаданих чи сторінок журналу. Будь-які зміни у файловій системі під час синхронної передачі даних блокуються до її завершення.
allquixotic

1
Дійсно? У bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 конкретно згадується, що нерозподілені сторінки НЕ будуть записані на диск на коміті (але, звичайно, на fsync ()). Патч фіксує деякі поширені випадки, коли така поведінка є проблематичною шляхом примусового виділення; однак про перезапис даних нічого не сказано.
lxgr

1
Ах, так commit=...і syncНЕ еквівалентні? Чи тито мав на увазі, що навіть за допомогою syncнього не робиться нерозподілених сторінок? Я не можу уявити, що це так, оскільки це порушить специфікації POSIX. Можливо, ви могли б використовувати той скрипт bash, який я надав для кращої безпеки даних: P
allquixotic

1
Я впевнений, що він мав на увазі перше, останнє зробить ext4 в Linux досить небезпечною для використання файловою системою;) Сценарій виглядає як непоганий спосіб вирішення; Я спробую, і, можливо, оцінюватимуть кілька моїх найважливіших програм із напругою - можливо, всі вони використовують fsync (), і я занадто переживаю ...
lxgr

1

Якою б не була відповідь на ваше запитання, це не має значення.

Гарантовано піддається поведінку файлової системи ext4 є те , що «дані будуть записані на диску після успішного sync/ fsyncвиклику». Отже, якщо у вас є програма, яка змушує вас задати це запитання, вам слід вставити дзвінки синхронізації в критичні точки, де потрібно забезпечити цілісність даних. Якщо ви переживаєте з тієї ж проблеми, ви можете викликати syncутиліту командного рядка, перш ніж робити будь-яку небезпечну поведінку, що може спричинити нечисте відключення.


Я знаю про fsync (); Я запитую як користувача програм, які можуть або не можуть його використовувати. Я оновив своє запитання.
lxgr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.