Эта проблема особенно очевидна для магнитных носителей, хотя твердотельные накопители также страдают от нее. Давайте попробуем дефрагментировать файловую систему XFS в этом посте.
Настройка песочницы
Во-первых, чтобы поэкспериментировать с файловой системой XFS, я решил создать тестовую среду вместо работы с критически важными данными на диске. Этот тестовый стенд состоит из виртуальной машины Ubuntu, к которой подключен виртуальный диск, обеспечивающий необработанное хранилище. Вы можете использовать VirtualBox для создания виртуальной машины, а затем создать дополнительный диск для подключения к виртуальной машине
Просто зайдите в настройки вашей виртуальной машины и в Настройки → Хранилище раздел вы можете добавить новый диск к контроллеру SATA вы можете создать новый диск. Как показано ниже, но при этом убедитесь, что ваша виртуальная машина выключена.
После создания нового диска включите виртуальную машину и откройте терминал. Команда lsblk перечисляет все доступные блочные устройства.
$ lsblksda 8: 0 0 60G 0 диск
├─sda1 8: 1 0 1M 0 часть
└─sda2 8: 2 0 60G 0 часть /
sdb 8:16 0 100G 0 диск
sr0 11: 0 1 1024M 0 rom
Помимо основного блочного устройства sda, там, где установлена ОС, теперь есть новое устройство sdb. Давайте быстро создадим из него раздел и отформатируем его с файловой системой XFS.
Откройте утилиту parted от имени пользователя root:
$ parted -a оптимальный / dev / sdbДавайте сначала создадим таблицу разделов с помощью mklabel, а затем создадим один раздел из всего диска (размером 107 ГБ). Вы можете убедиться, что раздел создан, перечислив его с помощью команды печати:
(расстались) mklabel gpt(разошлись) мкпарт первичный 0107
(разошлись) печать
(расстался) бросить
Хорошо, теперь мы можем видеть, используя lsblk, что есть новое блочное устройство под устройством sdb, называемое sdb1.
Отформатируем это хранилище как xfs и смонтируем в каталог / mnt. Снова выполните следующие действия как root:
$ mkfs.xfs / dev / sdb1$ mount / dev / sdb1 / mnt
$ df -h
Последняя команда распечатает все смонтированные файловые системы, и вы можете проверить, что / dev / sdb1 смонтирован в / mnt.
Затем мы записываем кучу файлов в качестве фиктивных данных для дефрагментации здесь:
$ dd if = / dev / urandom of = / mnt / myfile.txt count = 1024 bs = 1024Приведенная выше команда запишет файл myfile.txt размером 1 МБ. Вы можете автоматически преобразовать эту команду в простой цикл for с помощью bash и сгенерировать больше таких файлов. Разложите их по разным каталогам, если хотите. Удалить несколько из них случайным образом. Сделайте все это внутри файловой системы xfs (смонтированной в / mnt), а затем проверьте фрагментацию. Все это, конечно, необязательно.
Дефрагментируйте вашу файловую систему
Первое, что нам нужно сделать, это выяснить, как проверить степень фрагментации. Например, файловая система xfs, которую мы создали ранее, находилась на узле устройства / dev / sdb. Мы можем использовать утилиту xfs_db (расшифровывается как xfs debugging), чтобы проверить уровень фрагментации.
$ xfs_db -c frag -r / dev / sdb1Флаг -c принимает различные команды, среди которых есть команда frag для проверки уровня фрагментации. Флаг -r используется, чтобы убедиться, что операция полностью доступна только для чтения.
Если мы обнаружим, что в этой файловой системе есть фрагментация, мы запускаем команду xfs_fsr на узле устройства:
$ xfs_fsr / dev / sdb1Эта последняя команда - все, что нужно для дефрагментации вашей файловой системы, вы можете добавить ее как задание cron, которое будет регулярно контролировать вашу файловую систему. Но делать это для xfs не имеет смысла. Распределение XFS на основе экстентов гарантирует, что такие проблемы, как фрагментация, сведены к минимуму.
Сценарии использования
Сценарии использования, в которых вам нужно больше всего беспокоиться о фрагментации файловой системы, связаны с приложениями, в которых записывается и перезаписывается множество небольших фрагментов данных. База данных является классическим примером этого, и базы данных печально известны тем, что оставляют много-много «дыр» в вашем хранилище. Блоки памяти не заполняются непрерывно, в результате чего объем доступного пространства со временем становится все меньше и меньше.
Проблема возникает не только с точки зрения уменьшения полезного пространства, но и с точки зрения уменьшения количества операций ввода-вывода в секунду, что может снизить производительность вашего приложения. Наличие сценария для постоянного мониторинга уровня фрагментации - консервативный способ поддержки системы. Вы не хотите, чтобы автоматизированный скрипт произвольно запускал дефрагментацию вашей файловой системы, особенно когда она используется при пиковой нагрузке.