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. Это гарантирует автоматическое применение настроек для всех подключенных к системе устройств.