Перейти до вмісту

Диски і блочний рівень

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

Дефрагментація корисна на диску, що обертається, і шкідлива на SSD. Планувальник запитів, оптимальний для HDD, знижує продуктивність NVMe. RAID 5 на великих сучасних дисках небезпечніший, ніж здається. Усе це наслідки того, що там усередині.

Передумови. Драйвери, DMA і черги запитів (модуль 13).

Пластини обертаються, головка рухається впоперек. Час читання сектора складається з трьох частин:

  • переміщення головки — одиниці мілісекунд, і це найдорожче;
  • очікування обертання, поки потрібний сектор під’їде під головку; на 7200 обертах за хвилину половина оберту займає близько 4 мс;
  • передавання, тобто власне читання — десятки мікросекунд.

Перші дві частини механічні й від покоління до покоління не покращуються. Звідси головна властивість HDD: послідовне читання на два порядки швидше за випадкове. Тридцять років уся оптимізація дискового вводу-виводу зводилася до того, щоб перетворити випадковий доступ на послідовний.

Те саме на рівні черги робить планування запитів до диска: воно переупорядковує запити так, щоб головка рухалася в одному напрямку. Класичний алгоритм тут «ліфт» (SCAN) — іти в один бік, обслуговуючи все по дорозі, потім у зворотний.

Механіки тут немає, тому випадкове читання коштує майже стільки ж, скільки послідовне. Натомість з’являються обмеження, яких у HDD не було.

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

Тому всередині SSD працює рівень трансляції флеш-пам’яті, FTL, фактично власна файлова система контролера. Запис іде у вільне місце, а старе розташування позначається недійсним. Логічний блок 100 сьогодні й завтра — це різні фізичні комірки.

Наслідки з цього такі:

  • Вирівнювання зносу. Комірка витримує обмежену кількість перезаписів, тому FTL розподіляє записи рівномірно. Файл, який ви «перезаписуєте на місці», фізично щоразу лягає в нове місце.
  • Збирання сміття і TRIM. Контролер має знати, які блоки більше не потрібні. Команда TRIM повідомляє про це від файлової системи — без неї накопичувач із часом сповільнюється, бо змушений стирати блоки в момент запису.
  • Підсилення запису. Один логічний запис може спричинити кілька фізичних: перенести живі сторінки, стерти блок, записати нове.
  • Дефрагментація шкідлива. Вона не прискорює доступ (механіки немає), але витрачає ресурс перезапису.

NVMe є не типом пам’яті, а протоколом. SATA проєктувався під диск з однією головкою, тому має одну чергу на 32 команди. NVMe дає тисячі черг по тисячі команд, по одній на ядро процесора, і без цього паралелізм флеш-пам’яті нікуди подіти.

Кілька фізичних дисків, які виглядають як один. Заради швидкості, надійності або й того, і того разом.

Розкладка блоків даних і парності для RAID 0, 1, 5 і 10 RAID 0D1D2A1A2A3A4A5A6ємність 100%втрата будь-якого диска — втрата всьогоRAID 1D1D2A1A1A2A2A3A3ємність 50%витримує 1 дискRAID 5D1D2D3A1A2P1A3P2A4P3A5A6ємність (n−1)/nвитримує 1 дискRAID 10D1D2D3D4A1A1A2A2A3A3A4A4A5A5A6A6ємність 50%витримує 1 з кожної париблоки данихпарність
Вибір рівня — це вибір між ємністю, швидкістю запису і тим, скільки дисків можна втратити. Універсально правильного рівня не існує.

RAID 0 розкладає блоки по дисках, це називається смугуванням. Швидкість зростає, ємність повна, а от надійність виходить гіршою, ніж в одного диска: відмова будь-якого знищує весь масив. Попри назву, резервуванням тут і не пахне.

RAID 1 дзеркалює. Половина ємності, швидше читання, витримує відмову одного диска.

RAID 5 зберігає блоки даних плюс парність, тобто XOR решти блоків смуги, розподілену по всіх дисках. Втрачений блок відновлюється обчисленням. Ємність виходить (n−1)/n, витримує один диск.

RAID 10 збирає дзеркала у смугу. Половина ємності, найкраща продуктивність запису, витримує по одному диску з кожної пари.

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

Фізичні диски об’єднуються в групу томів, а з неї нарізаються логічні томи. Логічний том можна розширити на льоту, перенести на інший диск без зупинки або зробити з нього знімок — миттєвий образ стану на конкретний момент.

Знімок працює через те саме копіювання під час запису, що й у модулі 12: спочатку він не займає місця, а розростається в міру того, як змінюється оригінал. Класичний сценарій — узяти знімок, зробити з нього резервну копію несуперечливого стану й знімок видалити.

Terminal window
lsblk -o NAME,TYPE,SIZE,ROTA,SCHED,RQ-SIZE,MODEL

ROTA=1 — диск, що обертається, 0 — твердотільний. SCHED — поточний планувальник запитів.

Terminal window
cat /sys/block/*/queue/scheduler 2>/dev/null

Доступні планувальники, поточний у дужках. Для NVMe нормально бачити [none].

Terminal window
lsblk -D

Підтримка TRIM: ненульові DISC-GRAN і DISC-MAX означають, що пристрій приймає повідомлення про звільнені блоки.

Terminal window
systemctl status fstrim.timer 2>/dev/null | head -3

Періодичний TRIM. Сучасні дистрибутиви запускають його раз на тиждень таймером, а не опцією discard при монтуванні — так дешевше.

Terminal window
sudo smartctl -A /dev/sda 2>/dev/null | grep -Ei 'Power_On|Reallocated|Wear|Total_LBAs'

Здоров’я накопичувача: напрацювання, перепризначені сектори, залишковий ресурс запису для SSD.

Terminal window
cat /proc/mdstat 2>/dev/null; sudo vgs; sudo lvs 2>/dev/null

Стан програмного RAID і логічних томів.

Terminal window
iostat -xz 1 3 2>/dev/null | head -20

Навантаження на пристрої: r_await/w_await — затримка, aqu-sz — середня довжина черги. Висока затримка при короткій черзі означає повільний пристрій, а не перевантаження.

Типові помилки розуміння

Section titled “Типові помилки розуміння”

«RAID — це резервна копія». RAID захищає від відмови заліза. Видалений файл, зіпсовані дані й робота шифрувальника продублюються на всі диски однаково чесно.

«RAID 0 надійніший за один диск». Він гірший за один диск: відмова будь-якого знищує весь масив, а ймовірності відмов складаються.

«SSD треба дефрагментувати». Не треба. Виграшу не буде, бо механіки немає, а ресурс перезапису витратиться.

«Логічний блок 100 — це завжди те саме місце на SSD». FTL змінює фізичне розташування при кожному записі. Через це, до речі, надійно стерти дані з SSD перезаписом і не виходить.

«NVMe — це швидка флеш-пам’ять». NVMe є протоколом. Швидкість дає не він сам, а те, що він знімає обмеження SATA на одну чергу в 32 команди.

«Планувальник запитів завжди корисний». Для HDD так, а для NVMe його вимикають: переупорядкування коштує дорожче, ніж економить.

Перевір себе

1. Чому на диску, що обертається, послідовне читання на два порядки швидше за випадкове?
2. Навіщо SSD потрібна команда TRIM?
3. Масив RAID 0 із чотирьох дисків. Один вийшов з ладу. Що з даними?
4. Чому RAID 5 вважають ризикованим на дисках у 16–20 ТБ?
5. Що таке NVMe?
6. Чому знімок LVM створюється миттєво й спочатку не займає місця?

B5 — LVM і RAID. Зібрати масив із файлів-пристроїв, нарізати логічні томи, зробити знімок, «зламати» диск і простежити відновлення. Головна частина — виміряти, скільки триває відновлення і що з масивом відбувається весь цей час.