Як кеш запису працює з файловою системою, що охоплює диски з різною швидкістю?


9

Як у сучасній системі Linux з декількома дисками та програмним RAID, що охоплює як повільні (HDD), так і швидкі (SSD) диски, як записуються до кешованої файлової системи?

Для md-raid RAID1 масив може бути налаштований з дисками як --write-mostlyі, --write-behindщо припускає, що зчитування виконуються з більш швидкого диска, а запис на повільний диск може відставати. Але як це кешоване на рівні ядра? Чи кеш ядра записує диск перед або після шару md-raid? В кінці виклику write () гарантується, що дані гарантовано записуються в один з дискав --write-behind?

Як для btrfsRAID1 як склалася б однакова ситуація? Немає --write-behindфункціональних можливостей, тому брудні сторінки враховуються на рівні пристрою чи файлової системи? У який момент повернеться запис ()?

Як vm.dirty_*ratioнастроювання впливає на ці налаштування?

Відповіді:


7

--write-mostly, --write-behindОпрацьовується mdдрайвером внутрішньо. mdзберігає метадані, як растрова карта наміру (яка є обов'язковою для функції запису), яка в основному реєструє, які дані були записані, а які дані ще відсутні. Це необхідно в тому випадку, якщо є подія втрати електроенергії, коли дані ще не досягли пристроїв, що в основному записують. У такому випадку область даних буде повторно синхронізована (у вашому випадку читайте з SSD, записуйте на жорсткий диск).

Але як це кешоване на рівні ядра?

Для випадку запису, драйвер md в основному дублює запит запису внутрішньо. Запит на запис на головний запис переходить до основного накопичувача та повідомляє верхнім шарам "ОК, я це вже зробив"; після цього скопійований запит на запит залишається на стороні RAID, що знаходиться в основному позаду, і може зайняти більше часу, сподіваємось, не помічаючи нікого.

Тоді рівень рейду виконує багато кроків, щоб переконатися, що з пристрою запису не буде прочитано жодних даних, поки в черзі ще є очікувані запити на запис. Чому дані зчитуються з пристрою, що в основному записує? Ну, SSD, можливо, не вдався, тому все, що залишилося. Це складно, і записування вводить деякі кутові випадки.

Це, мабуть, і тому, що він підтримується лише для рівня RAID-1, а не для інших. Хоча теоретично може мати сенс мати SSD по суті як RAID-0 та два жорстких жорстких диска в режимі запису, проте немає підтримки для RAID-6, що записується. Це лише RAID-1 і рідко використовується навіть там.

На це не впливають інші налаштування кешу, в основному загальний механізм кешування не має жодної уваги щодо того, як mdдрайвер реалізував речі всередині країни. Кеш робить свою справу і md робить свою справу. Таким чином кеш файлової системи працює однаково для файлової системи поверх md порівняно з файловою системою на голому диску. (Реальність - це складніше, ніж це, але ви можете думати про це таким чином.)


3

Для md-raid RAID1 масив може бути налаштований з дисками як --write-mostlyі, --write-behindщо припускає, що зчитування виконуються з більш швидкого диска, а запис на повільний диск може відставати. Але як це кешоване на рівні ядра? Чи кеш ядра записує диск перед або після шару md-raid?

Після, оскільки ця особливість характерна для md-raid.

Ви повинні думати про цю функцію md-raid як буферизацію, а не кешування. Він обмежений наступним mdadmваріантом:

--записати =

Вкажіть, що режим запису повинен бути включений (дійсний лише для RAID1). Якщо аргумент вказаний, він встановить максимальну кількість дозволених записів, що дозволяються. Значення за замовчуванням - 256.

Я можу лише думати, що воно також обмежене нормальним буферуванням ядра та апаратним забезпеченням (тобто якщо це менше). Нормальне буферизація ядра обмежена nr_requestsі max_hw_sectors_kb. Див /sys/class/block/$write_behind_device/queue/. Під апаратним буферизацією я маю на увазі кеш-запис на накопичувачі.

В кінці виклику write () гарантується, що дані гарантовано записуються в один з дискав --write-behind?

Звичайно, якщо ви маєте на увазі, що write () був у файлі, відкритому за допомогою O_SYNC / O_DSYNC, або ви насправді мали на увазі write () + fsync (). Якщо ні, то гарантії взагалі не застосовуються.


Дякую, але це ставить ще одне питання: якщо файл був відкритий за допомогою O_SYNC, чи повертається запис () після того, як був записаний перший диск, або всі диски були записані в цьому випадку?
Стів

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