Linux-сервери часто працюють у режимі високого навантаження, зчитуючи або записуючи отримані дані на зовнішні накопичувачі, в якості яких найчастіше використовуються SSD-диски. Зниження продуктивності дискових накопичувачів є одним з основних негативних наслідків роботи сервера у високонавантаженому режимі. І хоча повністю усунути проблему не вдасться, значно зменшити її вплив все ж можна. У цьому може допомогти знання принципів роботи SSD-дисків і протоколів їхньої взаємодії з файловою системою. Розглянемо це питання детальніше на конкретному прикладі і вкажемо шляхи для поліпшення ситуації.
Самообслуговування SSD-накопичувачів і їх взаємодія з файловою системою
У процесі роботи Інтернет-сервера на зовнішніх пристроях зберігання інформації утворюються ділянки з даними, які необхідно періодично очищати або обнуляти. Це дає змогу відразу ж використовувати очищену ділянку для запису нової інформації. Такі ділянки отримали назву "блоки", а пристрої зберігання даних, які оперують блоками - "блокові пристрої". Саме до таких пристроїв належать SSD-диски, які записують, зчитують або видаляють дані на рівні блоків.
Блок, своєю чергою, складається з декількох сторінок, які є найменшими одиницями зберігання даних. SSD-накопичувачі здатні виконувати операції зчитування/запису даних також і на рівні сторінок, однак видалення даних можливе лише на рівні блоків.
Самообслуговування дискових накопичувачів полягає в автоматичному виконанні ними операцій з очищення від непотрібних даних або прибиранні "сміття" з помічених блоків. Однак самостійно пристрій цього робити не може, а лише за "вказівкою" файлової системи, яка, як відомо, визначає спосіб зберігання та обробки даних на диску. Саме вона позначає блоки з непотрібною інформацією, які потрібно очистити, і видає відповідну команду для блоку управління накопичувача. Такі команди отримали назву "TRIM-команди". Тільки після її надходження SSD-пристрій приступає до обнулення зайнятих сторінок пам'яті.
Наслідки некерованого надходження команд очищення "сміття" для SSD-пристроїв
Технологія очищення блоків SSD-пристрою за замовчуванням налаштована таким чином, що файлова система видає відповідну TRIM-команду під час виконання кожної операції видалення даних. Очевидно, що в цьому разі надходження TRIM-команд відбувається безперервно і не залежить від рівня реального завантаження SSD-диска. Це і є основною причиною зниження продуктивності дискових накопичувачів.
Виправити ситуацію можливо, якщо організувати надходження TRIM-команд в керуючий блок накопичувача тільки в ті моменти часу, коли він перебуває на мінімумі свого навантаження або ж у стані простою.
Проміжним варіантом буде встановлення режиму періодичного надходження TRIM-команд через рівні проміжки часу незалежно від інших факторів. Саме такий підхід є оптимальним рішенням у цій ситуації, і ми спробуємо тут реалізувати його на практиці.
Налаштування оптимального режиму прибирання "сміття" для SSD-дисків
Слід зазначити, що робота системи очищення дисків залежить не тільки від роботи файлової системи і самого накопичувача, а й також від налаштувань, встановлених для конкретної Linux-системи. Тут це організовано таким чином, що управління формуванням TRIM-команд здійснюється на двох рівнях - на рівні файлової системи (локальний рівень) і на глобальному рівні, налаштування якого вмикаються для всіх файлових систем одразу після завантаження.
Установки локального рівня, як правило, формуються під час монтування файлової системи за допомогою зазначення відповідних параметрів. Вони мають вищий пріоритет перед глобальним рівнем і тому відразу ж набувають чинності для змонтованого пристрою.
Глобальні установки зазвичай виставляють у спеціальному сценарії, який автоматично запускається системним даемоном одразу після завантаження системи. Спосіб його налаштування залежить від конкретної Linux-системи, які, як відомо, бувають різними.
Для початку розглянемо спосіб керування TRIM-командами на локальному рівні, тобто на рівні окремої файлової системи. Для роботи будемо використовувати сервер під керуванням ОС Ubuntu 22.04.
Керування TRIM-командами на рівні файлової системи
Перед тим, як виконувати будь-які дії, перевіримо поточні установки і з'ясуємо, який виставлено режим роботи TRIM-команд для файлових систем нашого накопичувача. Для цього виведемо в терміналі список змонтованих на цей момент файлових систем, для яких встановлено режим безперервної видачі TRIM-команд. Це можна зробити за допомогою утиліти findmnt з параметром discard:
$ findmnt -O discard
У результаті ми отримали інформацію про точку монтування пристрою (кореневий каталог), його повну назву (/dev/vda2), тип змонтованої файлової системи (ext4), а також список встановлених параметрів, серед яких є й опція discard. Це означає, що файлова система пристрою vda2 видає TRIM-команди безперервно під час виконання кожної операції видалення даних.
Для того щоб виправити ситуацію, потрібно виконати перемонтування файлової системи з потрібними нам параметрами. Це можна зробити за допомогою добре відомої команди mount, встановивши для неї параметр nodiscard:
$ sudo mount -o remount,nodiscard /
Таким чином ми відключили безперервний режим генерування TRIM-команд для пристрою vda2, що нас цілком влаштовує.
Однак процес зміни налаштувань ще не завершено, оскільки у файлі fstab знаходиться інформація з параметрами монтування для всіх наявних файлових систем, яка зчитується системою під час кожного завантаження. У неї також необхідно внести зроблені нами зміни. Для цього відкриємо зазначений системний файл за допомогою редактора:
$ nano /etc/fstab
Нижче наведено частину системного запису про пристрій, у якому присутній параметр discard.
/dev/disk/by-uuid/3cd87dc4-371e-6254-9b89-5231cfssbh7z / ext4 discard, ....
Видалимо його. У результаті запис про пристрій матиме вигляд, показаний на скріншоті нижче. У ньому параметр discard тепер відсутній.
Збережемо внесені у файл зміни та вийдемо з редактора.
Таким чином ми на локальному рівні відключили режим безперервної генерації TRIM-команд. Однак для ввімкнення потрібного нам режиму необхідно перевірити поточні налаштування на системному рівні і за необхідності внести в них потрібні зміни.
Увімкнення режиму періодичного самообслуговування SSD-дисків на глобальному рівні
Як уже говорилося, глобальний рівень управління режимом генерації TRIM-команд реалізується за допомогою відповідного сценарію з виставленими параметрами. В останніх версіях деяких Linux-подібних операційних систем такий сценарій уже присутній. У ньому за замовчуванням уже ввімкнено режим періодичної генерації TRIM-команд для дискового накопичувача, і тому робити тут нічого не потрібно. Зокрема, це стосується ОС Ubuntu 22.04, з якою ми зараз працюємо. Запуск сценарію здійснюється в автоматичному режимі один раз на тиждень за допомогою системного процесу cron. Щоб переконатися в цьому, достатньо переглянути вміст такого файлу:
$ nano /etc/cron.weekly/fstrim
Наведений нижче рядок і визначає потрібний нам режим генерації TRIM-команд.
/sbin/fstrim --all | | true
Тут вказано назву виконуваного файлу для формування TRIM-команди (fstrim), а також необхідний параметр –all. Періодичність запуску сценарію в один тиждень забезпечується знаходженням сценарію в каталозі cron.weekly.
Таким чином ми з'ясували, що для ОС Ubuntu 22.04 і наступних її версій для ввімкнення періодичного режиму самообслуговування SSD-дисків достатньо внести зміни на рівні файлових систем, що ми і зробили раніше. На глобальному ж рівні нічого робити не потрібно.
Для більшості інших операційних систем, таких як CoreOS, CentOS 7, Debian 8 і деяких інших зазначений режим можна ввімкнути за допомогою файлу fstrim.timer, вказавши його в рядку запуску команди systemctl. Це гарантує автоматичне застосування налаштувань для всіх підключених до системи пристроїв.