Диски і блочний рівень
Навіщо це
Section titled “Навіщо це”Файлова система бачить нумерований масив блоків. Під цією абстракцією ховаються пристрої з кардинально різною фізикою, і рішення, правильне для одного, для іншого виявляється шкідливим.
Дефрагментація корисна на диску, що обертається, і шкідлива на SSD. Планувальник запитів, оптимальний для HDD, знижує продуктивність NVMe. RAID 5 на великих сучасних дисках небезпечніший, ніж здається. Усе це наслідки того, що там усередині.
Передумови. Драйвери, DMA і черги запитів (модуль 13).
Диск, що обертається
Section titled “Диск, що обертається”Пластини обертаються, головка рухається впоперек. Час читання сектора складається з трьох частин:
- переміщення головки — одиниці мілісекунд, і це найдорожче;
- очікування обертання, поки потрібний сектор під’їде під головку; на 7200 обертах за хвилину половина оберту займає близько 4 мс;
- передавання, тобто власне читання — десятки мікросекунд.
Перші дві частини механічні й від покоління до покоління не покращуються. Звідси головна властивість HDD: послідовне читання на два порядки швидше за випадкове. Тридцять років уся оптимізація дискового вводу-виводу зводилася до того, щоб перетворити випадковий доступ на послідовний.
Те саме на рівні черги робить планування запитів до диска: воно переупорядковує запити так, щоб головка рухалася в одному напрямку. Класичний алгоритм тут «ліфт» (SCAN) — іти в один бік, обслуговуючи все по дорозі, потім у зворотний.
Механіки тут немає, тому випадкове читання коштує майже стільки ж, скільки послідовне. Натомість з’являються обмеження, яких у HDD не було.
Флеш-пам’ять читається сторінками, а стирається блоками, причому блок у сотні разів більший за сторінку. Перезаписати сторінку на місці неможливо, доведеться стерти цілий блок.
Тому всередині SSD працює рівень трансляції флеш-пам’яті, FTL, фактично власна файлова система контролера. Запис іде у вільне місце, а старе розташування позначається недійсним. Логічний блок 100 сьогодні й завтра — це різні фізичні комірки.
Наслідки з цього такі:
- Вирівнювання зносу. Комірка витримує обмежену кількість перезаписів, тому FTL розподіляє записи рівномірно. Файл, який ви «перезаписуєте на місці», фізично щоразу лягає в нове місце.
- Збирання сміття і TRIM. Контролер має знати, які блоки більше
не потрібні. Команда
TRIMповідомляє про це від файлової системи — без неї накопичувач із часом сповільнюється, бо змушений стирати блоки в момент запису. - Підсилення запису. Один логічний запис може спричинити кілька фізичних: перенести живі сторінки, стерти блок, записати нове.
- Дефрагментація шкідлива. Вона не прискорює доступ (механіки немає), але витрачає ресурс перезапису.
NVMe є не типом пам’яті, а протоколом. SATA проєктувався під диск з однією головкою, тому має одну чергу на 32 команди. NVMe дає тисячі черг по тисячі команд, по одній на ядро процесора, і без цього паралелізм флеш-пам’яті нікуди подіти.
Кілька фізичних дисків, які виглядають як один. Заради швидкості, надійності або й того, і того разом.
RAID 0 розкладає блоки по дисках, це називається смугуванням. Швидкість зростає, ємність повна, а от надійність виходить гіршою, ніж в одного диска: відмова будь-якого знищує весь масив. Попри назву, резервуванням тут і не пахне.
RAID 1 дзеркалює. Половина ємності, швидше читання, витримує відмову одного диска.
RAID 5 зберігає блоки даних плюс парність, тобто XOR решти блоків смуги, розподілену по всіх дисках. Втрачений блок відновлюється обчисленням. Ємність виходить (n−1)/n, витримує один диск.
RAID 10 збирає дзеркала у смугу. Половина ємності, найкраща продуктивність запису, витримує по одному диску з кожної пари.
Логічні томи
Section titled “Логічні томи”Надійність RAID розв’язує, а от гнучкість ні: розділи як були фіксованими, такими й лишилися. LVM додає рівень непрямої адресації між фізичними дисками й тим, що бачить файлова система.
Фізичні диски об’єднуються в групу томів, а з неї нарізаються логічні томи. Логічний том можна розширити на льоту, перенести на інший диск без зупинки або зробити з нього знімок — миттєвий образ стану на конкретний момент.
Знімок працює через те саме копіювання під час запису, що й у модулі 12: спочатку він не займає місця, а розростається в міру того, як змінюється оригінал. Класичний сценарій — узяти знімок, зробити з нього резервну копію несуперечливого стану й знімок видалити.
Як це насправді в Linux
Section titled “Як це насправді в Linux”lsblk -o NAME,TYPE,SIZE,ROTA,SCHED,RQ-SIZE,MODELROTA=1 — диск, що обертається, 0 — твердотільний. SCHED —
поточний планувальник запитів.
cat /sys/block/*/queue/scheduler 2>/dev/nullДоступні планувальники, поточний у дужках. Для NVMe нормально бачити [none].
lsblk -DПідтримка TRIM: ненульові DISC-GRAN і DISC-MAX означають,
що пристрій приймає повідомлення про звільнені блоки.
systemctl status fstrim.timer 2>/dev/null | head -3Періодичний TRIM. Сучасні дистрибутиви запускають його раз на тиждень
таймером, а не опцією discard при монтуванні — так дешевше.
sudo smartctl -A /dev/sda 2>/dev/null | grep -Ei 'Power_On|Reallocated|Wear|Total_LBAs'Здоров’я накопичувача: напрацювання, перепризначені сектори, залишковий ресурс запису для SSD.
cat /proc/mdstat 2>/dev/null; sudo vgs; sudo lvs 2>/dev/nullСтан програмного RAID і логічних томів.
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 його вимикають: переупорядкування коштує дорожче, ніж економить.
Перевір себе
Лабораторна
Section titled “Лабораторна”B5 — LVM і RAID. Зібрати масив із файлів-пристроїв, нарізати логічні томи, зробити знімок, «зламати» диск і простежити відновлення. Головна частина — виміряти, скільки триває відновлення і що з масивом відбувається весь цей час.
Джерела
Section titled “Джерела”- OSTEP: Hard Disk Drives, RAID, Flash-based SSDs
- Silberschatz, Operating System Concepts, розділ 11
man 8 lvm,man 8 mdadm,man 8 smartctl,man 8 fstrim- Documentation/block — блочний рівень Linux