Как настроить периодическое TRIM для хранения SSD на серверах Linux

Вступление

Из-за архитектуры твердотельных накопителей или твердотельных накопителей непрерывное использование приводит к снижению производительности, если не учитывать и не уменьшать. КомандаTRIM - это операция, которая позволяет операционной системе передавать на SSD информацию о том, какие блоки данных больше не используются. Это позволяет внутренним системам SSD лучше управлять выравниванием износа и подготовить устройство к будущим операциям записи. TRIM может оказать значительное влияние на производительность устройства с течением времени и его общий срок службы.

Хотя в Linux можно включить непрерывную TRIM, на самом деле это может отрицательно повлиять на производительность из-за дополнительных накладных расходов при обычных файловых операциях. Более мягкая альтернатива - настроитьperiodic TRIM. Это настраивает операционную систему для TRIM привода по расписанию, а не как необходимый компонент регулярных файловых операций. Почти во всех случаях он обеспечивает те же преимущества непрерывного TRIM без снижения производительности.

В этом руководстве мы кратко обсудим, как работают SSD и TRIM, а затем продемонстрируем, как включить периодическую TRIM в различных дистрибутивах Linux.

Как SSD хранят данные?

Чтобы лучше понять проблемы, которые решает TRIM, полезно знать несколько вещей о том, как твердотельные накопители хранят свои данные и управляют ими.

Единицы данных

Данные на SSD записываются и читаются в единицах фиксированного размера, известном какpages. Страницы, в свою очередь, группируются в более крупные блоки, называемыеblocks.

Чтение, запись и стирание ограничений

Твердотельные накопители могут читать и записывать страницы по отдельности. Однако они могут стирать данные только на уровне блоков. Еще одно ограничение заключается в том, что запись может выполняться только на страницах, которые были полностьюzeroed (все биты установлены в 0). Это означает, что перезапись данных напрямую невозможна.

Чтобы изменить данные, SSD фактически должен прочитать информацию из старого местоположения, изменить ее в памяти, а затем записать измененные данные на новые обнуленные страницы. Затем он обновляет внутреннюю таблицу, чтобы сопоставить логическое местоположение, которое операционная система отводит новому физическому местоположению данных на устройстве. Старое местоположение помечено в другой внутренней таблице какstale: не используется, но еще не обнулено.

Восстановление устаревших страниц

Чтобы восстановить устаревшие страницы, внутренние процессы сбора мусора на SSD должны прочитать все действительные страницы из блока и записать их в новый блок. Снова, внутреннее сопоставление таблицы логических и физических местоположений обновляется. Старый блок, который теперь не содержит уникальных, все еще используемых данных, затем может быть обнулен и помечен как готовый для будущих записей.

Что делает TRIM?

Внутренние процессы сбора мусора на SSD отвечают за стирание блоков и управление выравниванием износа. Однако файловые системы обычно «удаляют» данные, просто помечая их в своих собственных записях как пространство, которое снова доступно. Они на самом деле не стирают данные из основного хранилища, но могут перезаписать область, ранее занимаемую этими данными, при последующих записях.

Это означает, что SSD обычно не будет знать, что страница больше не нужна, пока не получит инструкции от файловой системы для записи в то же логическое расположение в более позднее время. Он не может выполнить свои процедуры сборки мусора, потому что он никогда не информируется, когда данные удаляются, только когда пространство, ранее зарезервированное для него, теперь должно использоваться для других данных.

Команда TRIM распространяет информацию о том, какие данные больше не используются, от файловой системы до SSD. Это позволяет устройству выполнять свои обычные обязанности по сбору мусора во время простоя, чтобы гарантировать, что есть нулевые страницы, готовые для обработки новых записей. SSD может перетасовывать данные заранее, очищать устаревшие страницы и, как правило, поддерживать устройство в хорошем рабочем состоянии.

Однако выполнение TRIM при каждом удалении может быть дорогостоящим и может отрицательно повлиять на производительность диска. Конфигурирование периодического TRIM дает устройству объемную информацию о ненужных страницах по регулярному расписанию, а не с каждой операцией.

Отключение непрерывной TRIM

Возможно, вы уже включили непрерывную TRIM на своих устройствах, когда они были подключены. Прежде чем включить периодическую TRIM, имеет смысл взглянуть на наши текущие параметры монтирования.

Непрерывный TRIM активируется путем монтирования диска или раздела с параметромdiscard.

Сначала найдите файловые системы, которые в настоящее время смонтированы с параметромdiscard:

findmnt -O discard
OutputTARGET     SOURCE    FSTYPE OPTIONS
/mnt/data  /dev/sda1 ext4   rw,relatime,discard,data=ordered
/mnt/data2 /dev/sdb1 ext4   rw,relatime,discard,data=ordered

Вы можете перемонтировать эти файловые системы на место без опцииdiscard, включив-o remount,nodiscard сmount:

sudo mount -o remount,nodiscard /mnt/data
sudo mount -o remount,nodiscard /mnt/data2

Если вы снова запустите командуfindmnt, вы не должны получить никаких результатов:

findmnt -O discard

Затем откройте файл/etc/fstab, чтобы увидеть параметры монтирования, определенные в настоящее время для ваших файловых систем. Они определяют, как файловые системы монтируются при каждой загрузке:

sudo nano /etc/fstab

Найдите параметрdiscard и удалите его из найденных строк:

/etc/fstab

. . .
# /dev/sda1 /mnt/data ext4 defaults,nofail,discard 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
# /dev/sdb1 /mnt/data2 ext4 defaults,nofail,discard 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0

Сохраните и закройте файл, когда вы закончите. Файловые системы теперь будут монтироваться без опцииdiscard и будут монтироваться таким же образом при последующих загрузках. Теперь мы можем настроить периодический TRIM для всех файловых систем, которые его поддерживают.

Настройка периодической TRIM для системных дистрибутивов

Настройка периодического TRIM для современных дистрибутивов, поставляемых с systemd, довольно проста.

Ubuntu 16.04

Ubuntu 16.04 поставляется со сценарием, который еженедельно запускаетсяcron. Это означает, что для Ubuntu 16.04 не нужно включать метод systemd, описанный в следующем разделе.

Если вы хотите изучить сценарий, вы можете увидеть его, набрав:

cat /etc/cron.weekly/fstrim
Output#!/bin/sh
# trim all mounted file systems which support it
/sbin/fstrim --all || true

Как видите, этому скрипту нужна версияfstrim с флагом--all. Многие версииfstrim, поставляемые с более ранними выпусками Ubuntu, не содержат этой опции.

Другие системные дистрибутивы

Для других дистрибутивов systemd периодический TRIM может быть включен с помощью файлаfstrim.timer, который будет запускать операции TRIM на всех подключенных дисках один раз в неделю. Это также позволяет использовать опциюfstrim --all.

На момент написания этой статьи это лучший метод для следующих дистрибутивов:

  • Debian 8

  • CentOS 7

  • Fedora 24

  • Fedora 23

  • CoreOS

Для CentOS 7, Fedora 23, Fedora 24 и CoreOS единицы измеренияfstrim.service иfstrim.timer доступны по умолчанию. Чтобы запланировать еженедельную TRIM для всех подключенных совместимых дисков, включите модуль.timer:

sudo systemctl enable fstrim.timer

В Debian 8fstrim.service иfstrim.timer доступны в файловой системе, но по умолчанию они не загружаются в systemd. Вам просто нужно сначала скопировать файлы:

sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system

Теперь вы можете включить таймер так же, как и в других дистрибутивах:

sudo systemctl enable fstrim.timer

Ваш сервер должен теперь TRIM все монтируемые файловые системы, которые поддерживают операцию, один раз в неделю.

Настройка периодического TRIM для несистемных распределений

По совпадению, большинство выпусков дистрибутивов, которые поставляются с системами инициализации, не относящимися к systemd, также поставлялись с версиями утилитыfstrim, не имеющими флага--all. Это значительно усложняет безопасные автоматические операции TRIM.

Использование TRIM на дисках, которые его не поддерживают, или на устройствах, которые его неправильно внедряют, может быть опасным и привести к потере данных. Флаг--all может безопасно обрабатывать эти сценарии, но попытка вручную определить, правильно ли подключенные диски поддерживают операцию, может быть опасной.

В Ubuntu 14.04 включен короткий сценарий под названиемfstrim-all, который пытается это сделать. Еженедельный сценарий, запускаемыйcron, выполняет это. Однако скрипт не всегда правильно интерпретирует способность TRIM подключенных дисков.

Для этого и других дистрибутивов с командамиfstrim без флага--all лучшим обходным решением может быть компиляция статически связанной версииfstrim, которая включает этот флаг. Его можно установить вместе с версией, управляемой дистрибутивом, и вызывать только явно из заданияcron.

Это может быть лучшим вариантом для следующих дистрибутивов:

  • Ubuntu 14.04

  • Ubuntu 12.04

  • Debian 7

  • CentOS 6

Для Ubuntu 14.04, вероятно, лучше всего отключить запуск скриптаfstrim-all, поскольку он может неправильно определять статус:

sudo chmod a-x /etc/cron.weekly/fstrim
sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak

Для других дистрибутивов вы можете сразу перейти.

Установите средства компиляции программного обеспечения

Сначала установите необходимые инструменты для сборки программного обеспечения.

Для систем Ubuntu и Debian это можно сделать, набрав:

sudo apt-get update
sudo apt-get install build-essential

Для систем CentOS вы можете установить аналогичный набор инструментов, набрав:

sudo yum groupinstall 'Development Tools'

Теперь у вас есть зависимости сборки, необходимые для компиляции последней версииfstrim.

Загрузите и распакуйте исходные файлы

Утилитаfstrim выпущена вместе с другими инструментами в группе под названиемutil-linux. Вы можете найти исходный код, упорядоченный по версии выпуска,here.

Нажмите на самую последнюю версию пакета. На данный момент этоv2.28, но по мере продолжения разработки он может измениться.

В следующем каталоге найдите самый последний архив для программного обеспечения. Это начнется сutil-linux- и закончится.tar.gz. В настоящее время самая последняя стабильная версия -util-linux-2.28.1.tar.gz. Щелкните правой кнопкой мыши по соответствующей ссылке и скопируйте ее в буфер обмена.

Вернувшись на свой сервер, перейдите в каталог/tmp. Используйте утилитуcurl илиwget и вставьте URL-адрес, который вы скопировали, чтобы загрузить файл:

cd /tmp
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.gz

Затем распакуйте архив, чтобы создать структуру каталогов источника:

tar xzvf util-linux*

Теперь, когда у нас есть исходный код и инструменты для сборки, мы можем собрать программное обеспечение.

Сконфигурируйте и скомпилируйте статически связанный fstrim

Начните с ввода извлеченной структуры каталогов:

cd /tmp/util-linux*

Далее нам нужно настроить программное обеспечение. Поскольку мы устанавливаем только изолированный двоичный файлfstrim и не хотим перезаписывать утилиты и библиотеки, управляемые нашей системой управления пакетами, мы скомпилируем статический двоичный файл.

Для этого нам нужно включить статическое связывание и отключить общие библиотеки. Настройте программное обеспечение с этими свойствами, набрав:

./configure --enable-static --disable-shared

После настройки программного обеспечения вы можете скомпилировать утилитуfstrim, набрав:

make fstrim

Это скомпилирует утилиту, поместив ее в каталог верхнего уровня извлеченного архива.

Скопируйте двоичный файл в каталогnot в вашем PATH. Поскольку нас интересует только вызов этого из сценарияcron, мы должны убедиться, что он не конкурирует с установленным системойfstrim для других целей.

Мы создадим каталог с именем/cron-bin и поместим туда двоичный файл:

sudo mkdir /cron-bin
sudo cp /tmp/util-linux*/fstrim /cron-bin

Теперь у нас есть доступ к более функциональной утилитеfstrim.

Создать еженедельный скрипт Cron для запуска fstrim

Теперь мы можем создать новый скрипт, который будет запускатьсяcron еженедельно. Это будет точно такой же скрипт, который включен в Ubuntu 16.04, за исключением того, что он будет указывать на место, где мы разместили наш статически скомпилированный двоичный файл.

Создайте файл, набрав:

sudo nano /etc/cron.weekly/fstrim

Внутри вставьте следующие строки. Это запустит наш новый двоичный файлfstrim с параметром--all:

/etc/cron.weekly/fstrim

#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim --all || true

Сохраните и закройте файл, когда вы закончите.

Сделайте скрипт исполняемым, набрав:

sudo chmod a+x /etc/cron.weekly/fstrim

Демоныcron иanacron будут запускать этот сценарий один раз в неделю, чтобы ОБРЕЗАТЬ файловые системы.

Заключение

Теперь ваш сервер Linux должен быть настроен на еженедельную проверку TRIM всех поддерживаемых файловых систем. TRIM помогает максимизировать как долгосрочную производительность, так и срок службы ваших твердотельных накопителей.

Непрерывные операции TRIM могут показаться идеальными, но они могут добавить значительные накладные расходы к обычным операциям файловой системы. Периодическая TRIM предлагает хорошее промежуточное положение, передавая ключевую информацию, необходимую для выполнения планового обслуживания диска в запланированном задании, а не как компонент каждой файловой операции.

Related