Последнее изменение файла: 2022.03.04
Скопировано с www.bog.pp.ru: 2023.09.23
Bog BOS: Файловая система XFS (Linux)
Журналируемая файловая система
xfs
позволяет использовать блочные устройства размером более 16ТБ (пакеты xfsprogs и xfsdump),
первоначально была разработана для SGI IRIX, поддерживает расширенные атрибуты файлов,
выделение места экстентами, эффективное распараллеливание за счёт разбиения области данных
на независимые отсеки. Является файловой системой по умолчанию в RHEL 7.
Поддержка отличных от Linux ОС брошена в xfsprogs 4.19.
Не очень любит мелкие файлы. Предпочтительна при большом количестве потоков доступа.
Форма файловой системы на диске имеет несколько версий, текущая - V5.
состоит из секций данных (содержит метаданные и может содержать журнал), журнала и секции для работы в реальном времени
секция данных делится на равные группы блоков (allocation groups),
количество которых определяет уровень параллелизма при выделении места; каждая группа содержит суперблок,
управление свободным пространством группы, таблицу inode (создаются по потребности), данные
размер блока в Linux - 4 КБ
выделение места происходит экстентами (до 8 GiB)
ранее не подходила для хранения большого количества мелких файлов (почтовый сервер) - медленно работает с метаданными;
постепенно улучшается
открытые в момент неожиданного выключения компьютера файлы будут заполнены нулями (исправлено)
мгновенное создание и расширение файловой системы при нулевых накладных расходах (у ext4 - 1.5%, т.е. 269GB для 16ТБ)
и примерно сравнимых с ext4 накладных расходах при хранении файлов
(на 0.07% меньше для набора в 10TB из 10 миллионов файлов
64-битные номера inode для файловой системы размером 2ТиБ и более,
не все 32-битные программы это переживут; исправлено в RHEL7
-d su=размер-страйпа-RAID,sw=число-страйпов-RAID # можно указывать единицы объёма: k, m, g
-d agcount=число-групп-блоков
-d agsize=размер-группы-блоков # от 16 MiB до 1 TiB; можно указывать единицы объёма: k, m, g
-d unwritten=1 # помечать незаписанные экстенты, увеличивает безопасность (не даёт пользователям читать
захваченные, но ещё не записанные части файлов), уменьшает фрагментацию?,
замедляет работу; "unknown option -d unwritten=0"
-i attr=2 # версия политики размещения расширенных атрибутов (по умолчанию)
-i maxpct=процентов # максимальная доля, которую inode могут занимать на диске,
по умолчанию - от 1% до 25% в зависимости от размера файловой системы
-i size=байт # размер фиксированной части inode, от 256 (по умолчанию) до 2048
-i align=1 # выравнивать блоки inode (по умолчанию)
-l internal=1 # журнал внутри
-l logdev=устройство-для-журнала # вынос журнала на отдельное устройство экономит до 10 IOPS
-l size=байт # размер журнала (от 512 до 64K блоков, по умолчанию - 128 MiB)
-l su=размер-страйпа-RAID # можно указывать единицы объёма: k, m, g
-l lazy-count=1 # не обновлять счётчики суперблока при каждом изменении метаданных, ускоряет
(по умолчанию)
-m crc=1 # контрольные суммы метаданных, в RHEL 7.1
-s размер-сектора
-f # затирать обнаруженную на блочном устройстве файловую систему
-N # вывести параметры, но не создавать файловую систему
-K # не использовать TRIM во время создания файловой системы
allocsize=байт # при увеличении файла место захватывается указанными кусками, лишнее потом освобождается;
от 4KiB до 1TiB; по умолчанию - 64KiB
attr2 # ускоренная обработка атрибутов (по умолчанию)
barrier # использовать барьерную синхронизацию при записи метаданных
(не нужно при наличии батарейки RAID контроллера или внешнего хранилища)
biosize=16 # размер блока в буферизованных запросах ввода/вывода в виде двоичного логарифма
grpid|bsdgroups # gid для создаваемого файла берётся от gid каталога
nogrpid|sysvgroups # gid для создаваемого файла берётся от процесса (по умолчанию), если каталог
не имеет бита setgid
delaylog # ускоряет создание и удаление файлов в десятки раз (в F15 или RHEL6.2 по умолчанию) -
но всё равно ext4 быстрее; опция nodelaylog не поддерживается с RHEL 6.5
dmapi # задействовать интерфейс DMAPI (Data Management API) для mtpt
filestreams # использовать алгоритм выделения свободного место, адаптированный для работы с
несколькими параллельными потоками; значительно ускоряет как запись, так и чтение;
может быть применён к отдельному каталогу с помощью атрибута filestreams
ihashsize=число # размер хеш-таблицы для inode в памяти
ikeep # опустевший кластер inode не удаляется (по умолчнию)
noikeep # после освобождения всех inode в кластере отдавать весь кластер в пул свободного места (noikeep)
inode64 | inode32 # 64-битные номера inode (NFS под CentOS4 и Solaris 8 монтируется нормально,
но некоторые 32-битные программы не умеют работать с файлами с большими inode);
по умолчанию используются (использовались?) 32-битные inode, что приводит к их размещению только в первых 2ТБ диска,
что вызывает сообщение о нехватке места при его формальном изобилии
(у меня "кончилось место" при наличии свободных 20 ТБ);
в CentOS 7.3 нормально использовалась файловая система на 35 ТБ (100 миллионов файлов, attr2,filestreams,inode32)
largeio # изображает устройство с большими секторами (swidth или allocsize)
nolargeio # изображает устройство с маленькими секторами
logbufs=число-буферов-журнала # от 2 до 8; по умолчанию - 2 для файловой системы с размером блока 4 KiB;
больше буферов - быстрее запись
logbsize=размер-буфера-журнала # 16384 или 32768 (по умолчанию) или 65536 или 131072 или 262144
logdev=устройство-для-журнала
noalign
noatime
nodiratime
norecovery # не проигрывать журнал при монтировании
nouuid # не обращать внимания на дубли UUID
osyncisdsync # записывать файлы, открытые в режиме O_SYNC, как в режиме O_DSYNC; ускоряет работу;
в новых версиях установлен по умолчанию, не отключаем
osyncisosync # записывать файлы, открытые в режиме O_SYNC, как в режиме O_SYNC
Кстати, опыт показал, что xfs сбрасывает накопленные буфера с такой интенсивностью,
что захлёбывается внешнее хранилише (RAID контроллер), поэтому рекомендуется обеспечить ранее начало
сброса: 40000000 в /proc/sys/vm/dirty_bytes, 10000000 в /proc/sys/vm/dirty_background_bytes.
Проблема с излишней фрагментацией
("XFS: ... possible memory allocation deadlock") купируется сбросом буферов в slab ("echo 2 > /proc/sys/vm/drop_caches").
У меня это произошло с индексным фйалом MySQL при добавлении ключа (файл 40ГБ оказался разбит на 3 миллиона кусочков).
xfsprogs содержит программы создания и обслуживания файловых систем XFS.
RHEl/CentOS 7 - версия 4.5.
xfs_info (скрипт для xfs_db).
xfs_admin (скрипт для xfs_db) позволяет изменить метку и UUID размонтированной фаловой системы.
xfs_check (скрипт для xfs_db) - проверка файловой системы, требуется размонтирование,
требует 16 ГБ памяти (реально использовались 10 ГБ) для файловой системы в 7 TB (67%, 500 файлов);
требует и реально использует 42 ГБ памяти для файловой системы в 20TB, быстр.
xfs_logprint - вывод и разбор журнала.
xfs_metadump (скрипт для xfs_db) - вывод метаданных в файл.
Определить уровень фрагментации файлов: "xfs_db -c frag -r блочное-устройство" (размонтирование не требуется,
но иногда случается "Segmentation fault"; показывает долю "лишних" экстентов).
Определить уровень фрагментации свободного пространства: "xfs_db -c freesp -r блочное-устройство"
(размонтирование не требуется).
Утилита дефрагментирования файла или файловой системы xfs_fsr (в качестве параметра можно указать
файл или блочное устройство; по умолчанию - все файлы на всех файловых системах);
не требует размонтирования. По очереди копирует все фрагментированные файлы в непрерывный кусок свободной области
(если есть), затем меняет ссылку на файл. Отображённые в память (map) файлы не обрабатываются.
Команда chattr утилиты xfs_io позволяет пометить файлы, которые не надо дефрагментировать (атрибут f).
На каждом проходе обрабатывается 10% самых фрагментированных файлов (или просто самых больших?).
Информация о следующем к обработке файле хранится в /var/tmp/.fsrlast_xfs, т.е. может продолжать прерванную работу.
Лучше запускать почаще, т.к. дефрагментировать сильно "загаженную"
файловую систему утилита неспособна - свободное место фрагментируется в пыль, после чего становится невозможно
дефрагментировать большие файлы. Опции:
-v
-t секунд (7200; максимальное время работы)
Утилита восстановления структуры файловой системы xfs_repair (после аварийного отключения компьютера
требуется смонировать и размонтировать файловую систему перед вызовом xfs_repair;
1 ГБ ОП и 12 секунд на 7.5 ТБ и 500 файлов, быстра); ключи:
-L (обнулить журнал)
-n (только проверка)
-t секунд (интервал между отчётами)
-v
Утилиты xfsdump и xfsrestore могут помочь извлечь данные из файловой системы, которой не помогла xfs_repair
(требуется монтирование).
Утилита xfs_growfs позволяет увеличить размер файловой системы без размонтирования
(уменьшение размера файловой системы невозможно).
множество примеров скоростных характеристик в статье про RAID
Проверка деградации (чтение tarnull) после полутора лет эксплуатации под хранилище томов bacula
(большие и очень большие файлы, XFS, LVM
над LSI MegaRAID 9266-8i - 2 RAID-6 по 18 дисков, SAS 4TB, rdcache=NoRA, iopolicy=Direct):
Проверка деградации (чтение tarnull) после полутора лет эксплуатации под хранилище томов bacula
(большие и очень большие файлы, XFS, LVM
над LSI MegaRAID 9266-8i - 2 RAID-6 по 18 дисков, SAS 4TB, rdcache=RA, iopolicy=Cached):