Уменьшаем вероятность сбоя файловой системы linux и потери данных

Reduction_Gear

В этой статье мы рассмотрим прием, который позволит Вам улучшить надежность файловой системы сервера или виртуальной машины за счет применения специальных настроек ядра linux.

Для начала необходимо обратить внимание на такое свойство оптимизации производительности ОС, как Writecache. Это свойство позволяет операционной системе выполнять запись на диск не каждый раз, когда требуется записать данные, а 1 раз в некоторый промежуток времени, при этом эти данные хранятся в оперативной памяти. Если в этот промежуток (до сброса) происходит ЧП (потеря питания, системный сбой и т.п.), то данные просто теряются.

Для чего же используется такой «ненадежный» механизм? Очень просто… С использованием write cache приложение может сразу получить статус «записано» вместо того, чтобы ожидать, когда данные попадут на диск. Это очень полезное свойство, которое особенно актуально, если используются «медленные» носители информации (SATA, SAS диски) с высоким временем доступа к ячейке хранения данных. Если при использовании таких устройств отключить Writecache, то производительность деградирует очень сильно, однако для устройств SSD, RAM дисков и т.п. Writeback не имеет такого существенного значения, однако полностью его отключать все же не стоит, поскольку производительность может ухудшиться (все таки время доступа в RAM значительно ниже, чем на SSD).

Итак, перейдем к цифрам… По умолчанию, для Linux время, в течение которого ОС держит «грязные» данные в RAM — 30 секунд. Это означает, что, к примеру, все транзакции в СУБД MySQL, сделанные в течение последних 30 секунд могут быть утеряны, если ОС «выключится» до момента сброса кэша на диск. Вот так просто… Почему это так? Потому, что это настройка best-effort, которая подходит для системы, после установки по-умолчанию.

Оставлять это в таком виде или нет — решать Вам. Для изменения данных настроек можно использовать специальные переменные ядра:

vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 200

которые необходимо добавить в /etc/sysctl.conf и выполнить sysctl -p. Конкретно эти настройки позволяют установить время хранения грязных данных в RAM в 2 секунды и каждую секунду проверять нужно ли данные сбрасывать на диск.

Установив данные параметры, Вы сможете значительно снизить вероятность потери данных VM или аппаратного сервера в случае нештатного поведения и упростить восстановление системы после сбоев.