Перейти до вмісту
Блог › Налаштування ПЗ › Оптимізація роботи SSD-накопичувачів Інтернет-серверів

Оптимізація роботи SSD-накопичувачів Інтернет-серверів

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. Це гарантує автоматичне застосування налаштувань для всіх пристроїв, підключених до системи.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *