|
Bog BOS: Файловая система XFS (Linux)
|
Последнее изменение файла: 2024.06.13
Скопировано с www.bog.pp.ru: 2024.11.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)
- inode состоит из фиксированной части и переменной части (данные каталога для маленьких каталогов;
атрибуты для атрибутов малого размера; символические ссылки малого размера;
список экстентов для файлов с малым количеством экстентов или корень дерева экстентов для файлов с большим количеством экстентов)
- ранее не подходила для хранения большого количества мелких файлов (почтовый сервер) - медленно работает с метаданными;
постепенно улучшается
- открытые в момент неожиданного выключения компьютера файлы будут заполнены нулями (исправлено)
- мгновенное создание и расширение файловой системы при нулевых накладных расходах (у ext4 - 1.5%, т.е. 269GB для 16ТБ)
и примерно сравнимых с ext4 накладных расходах при хранении файлов
(на 0.07% меньше для набора в 10TB из 10 миллионов файлов
- 64-битные номера inode для файловой системы размером 2ТиБ и более,
не все 32-битные программы это переживут; исправлено в RHEL7
Ключи утилиты mkfs.xfs:
- -L метка-файловой-системы # до 12 символов
- -b size=размер-блока-файловой-системы # 4096
- -s size=512 # размер сектора устройства в байтах
- -m crc=1 # контрольные суммы метаданных, в RHEL 7.1
- -m bigtime=0 # отметки времени в формате до 2486 года вместо до 2038; в RHEL 8
- -m finobt=1 # вести b-дерево свободных inode в каждой группе выделения; резервирует 1/8 от 1%
- -m inobtcount=0 # записывать число блоков, использованных b-деревьями inode и свободных inode; ускоряет монтирование
- -m uuid=случайное-значение
- -m rmapbt=0 # b-дерево обратного индекса для каждой группы выделения; помогает при восстановлении файловой системы
- -m reflink=1 # b-дерево счётчика ссылок для каждой группы выделения; необходим для сегментов CoW (использовать: "cp --reflink");
резервирует 1%
- -d agcount=число-групп-выделения
- -d agsize=размер-группы-выделения # от 16 MiB до 1 TiB; альтернатива agcount; можно указывать единицы объёма: k, m, g
- -d cowextsize=32 # размер COW сегментов в блоках файловой системы
- -d su=размер-страйпа-RAID,sw=число-страйпов-RAID # можно указывать единицы объёма: k, m, g
- -d unwritten=1 # помечать незаписанные экстенты, увеличивает безопасность (не даёт пользователям читать
захваченные, но ещё не записанные части файлов), уменьшает фрагментацию?,
замедляет работу; удалено
- -d noalign # "не умничать", пытаясь определить геометрию устройства хранения
- -d projinherit=идентификатор-проекта # использовать указанный идентификатор проекта для квотирования для корня и наследовать далее
- -d extszinherit=блоков-файловой-системы # подсказка размера экстента для корня, наследуется
- -i size=байт # размер фиксированной части inode, от 256 или 512 (по умолчанию без crc и с crc) до 2048
- -i maxpct=процентов # максимальная доля, которую inode могут занимать на диске (резервируется для режима 32bit),
по умолчанию - от 1% до 25% в зависимости от размера файловой системы; можно указать 0
- -i align=1 # выравнивать блоки inode (по умолчанию)
- -i attr=2 # версия политики размещения расширенных атрибутов (по умолчанию)
- -i projid32bit=1 # использовать 32-битные идентификаторы проекта
- -i sparse=1 # при недостатке места выделять место под 64бит inode мелкими кусками
- -l internal=1 # журнал внутри
- -l agnum=номер # хранит журнал в указанной групе выделения
- -l logdev=устройство-для-журнала # вынос журнала на отдельное устройство экономит до 10 IOPS
- -l size=байт # размер журнала (от 512 до 64K блоков, по умолчанию - 128 MiB)
- -l su=размер-страйпа-RAID # можно указывать единицы объёма: k, m, g
- -l lazy-count=1 # не обновлять счётчики суперблока при каждом изменении метаданных, ускоряет
(по умолчанию)
- -n size=4096 # размер блока каталогов в байтах
- -n version=2 # ci - ASCII имена
- -n ftype=1 # хранить тип inode прямо в каталоге
- -f # затирать обнаруженную на блочном устройстве файловую систему
- -N # вывести параметры, но не создавать файловую систему
- -K # не использовать TRIM во время создания файловой системы
- -p прототип
- -q # не болтать
Опции монтирования:
- allocsize=байт # при увеличении файла место захватывается указанными кусками, лишнее потом освобождается;
от 4KiB до 1TiB; по умолчанию определяется динамически
- attr2 # ускоренная обработка атрибутов (по умолчанию)
- nodiscard|discard # использовать TRIM/UNMAP; не рекомендуется включать из-за скорости
- barrier # использовать барьерную синхронизацию при записи метаданных
(не нужно при наличии батарейки RAID контроллера или внешнего хранилища); удалено в ядре 4.19
- 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);
по умолчанию до ядра 3.7 использовались 32-битные inode, что приводит к их размещению только в первых 2ТБ диска,
что вызывает сообщение о нехватке места при его формальном изобилии (у меня "кончилось место" при наличии свободных 20 ТБ);
в CentOS 7.3 уже нормально использовалась файловая система на 35 ТБ (100 миллионов файлов, attr2,filestreams,inode32)
- largeio # изображает устройство с большими секторами (swidth или allocsize)
- nolargeio # изображает устройство с маленькими секторами
- logbufs=число-буферов-журнала # от 2 до 8; по умолчанию - 2 (теперь 8?) для файловой системы с размером блока 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; удалено
- uquota/usrquota/uqnoenforce/quota/gquota/grpquota/gqnoenforce/pquota/prjquota/pqnoenforce # noquota - не считать
- sunit=размер-страйпа-RAID-в-секторах
- swidth=ширина-страйпа-RAID-в-секторах # размер-страйпа X число-дисков-данных
- swalloc # округлять выделяемое место по swidth
- wsync # все операции с именами (создать, удалить) делать в синхронном режиме
Статистика и ручки управления:
- /proc/fs/xfs/stat - статистика
- /proc/sys/fs/xfs - ручки управления
- age_buffer_centisecs - 1500, возраст метаданных для сброса на диск
- error_level (?)
- filestream_centisecs - 3000
- inherit_noatime
- inherit_nodefrag
- inherit_nodump
- inherit_nosymlinks
- inherit_sync
- irix_sgid_inherit
- irix_symlink_mode - позволяет устанавливать права доступа символьных ссылок (отключено)
- panic_mask (?)
- rotorstep - 1, сколько файлов размещать в группе перед переходом к следующей
- restrict_chown - запрещает передавать права на файл другим пользователям (отключено, нев в RHEL7)
- speculative_prealloc_lifetime (?)
- stats_clear (?)
- xfsbufd_centisecs - 100, интервал сборки мусора в буферах метаданных
- xfssyncd_centisecs - 3000, интервал сброса метаданных
Кстати, опыт показал, что 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. RHEL/Rocky Linux 8.9 - версия 5.0
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 позволяет увеличить размер файловой системы без размонтирования
(уменьшение размера файловой системы невозможно).
Прочее: xfs_bmap, xfs_freeze, xfs_io (манипуляция внутренними структурами и отладчик), xfs_mdrestore, xfs_mkfile, xfs_ncheck, xfs_quota.
Изменения (файл CHANGES)):
- 5.4 (UEK6) относительно 4.20
- mkfs.xfs: по умолчанию reflink (?)
- адаптация к ядру 5.4
- xfs_io: bulkstat
- 4.20 относительно 4.5 (RHEL 7):
- xfs_io: copy_file_range, set_encpolicy, get_encpolicy, statx, fsmap
- xfs_spaceman
- mkfs.xfs: 0 в качестве ширины полоски, по умолчанию sparse inodes
- xfs_scrub
Раздел под резервное копирование bacula поверх
автономного дискового массива HP StorageWorks MSA P2000 G3 (FC)
- подключить дисковый массив к контроллеру FibreChannel
- создать 2 массива RAID-6 (12x2TB) по 20TB, LUN во весь размер на каждом (24 диска в 1 LUN не умеет)
- создать логический том
pvcreate -v -M2 --dataalignment 640 /dev/sda /dev/sdb
vgcreate t100 /dev/sda /dev/sdb
lvcreate --name bacula --extents +100%FREE --stripes 2 --stripesize 4096 t100
- создать файловую систему
mkfs.xfs -f -L bacula100 -d su=64k,sw=2 -i attr=2 -l su=64k,lazy-count=1 /dev/t100/bacula
- монтирование (/etc/fstab)
LABEL=bacula100 /backup xfs nodiratime,relatime,attr2,logbufs=8,logbsize=256k,inode64,filestreams,nobarrier 1 2
- настройки в /etc/rc.local
echo noop > /sys/block/sda/queue/scheduler
echo noop > /sys/block/sdb/queue/scheduler
echo 256 > /sys/block/sda/queue/nr_requests
echo 256 > /sys/block/sdb/queue/nr_requests
echo 1280 > /sys/block/sda/queue/read_ahead_kb
echo 1280 > /sys/block/sdb/queue/read_ahead_kb
echo 262144 > /proc/sys/vm/min_free_kbytes
echo 100000000 > /proc/sys/vm/dirty_background_bytes
echo 400000000 > /proc/sys/vm/dirty_bytes
- проверка скорости (линейная скорость ограничена здесь FC контроллером на 4Gb)
bonnie++ -d /backup/temp -s 65000 -n 0 -f
Version 1.96 ------Sequential Output------ --Sequential Input- --Random-
Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
s204.cs.niis 65000M 402058 38 336754 44 527123 32 558.2 44
Latency 31788us 235ms 108ms 95093us
s204.cs.nii 130000M 402242 38 336749 44 434895 29 447.8 36
Latency 287ms 176ms 102ms 114ms
- множество примеров скоростных характеристик в статье про RAID
Проверка деградации (чтение tarnull) после полутора лет эксплуатации под хранилище томов bacula
(большие и очень большие файлы, XFS, LVM
над LSI MegaRAID 9266-8i - 2 RAID-6 по 18 дисков, SAS 4TB, rdcache=NoRA, iopolicy=Direct):
- 1 поток - 16911270150144 bytes (17 TB) copied, 60008.1 s, 282 MB/s
- 2 потока - 10441797402624 bytes (10 TB) copied, 32280.2 s, 323 MB/s
- 4 потока - 8016907730944 bytes (8.0 TB) copied, 15049.9 s, 533 MB/s
- 6 потоков - 15313932386304 bytes (15 TB) copied, 22621.3 s, 677 MB/s
- 8 потоков - 32895813025792 bytes (33 TB) copied, 42517.9 s, 774 MB/s
- 10 потоков - 30828863160320 bytes (31 TB) copied, 34851.2 s, 885 MB/s (пока их ещё 10)
- 12 потоков - 35113530294272 bytes (35 TB) copied, 39212.2 s, 895 MB/s (пока их ещё 6)
- 16 потоков - 17077979054080 bytes (17 TB) copied, 13573.9 s, 1.3 GB/s (пока их ещё 16)
- 20 потоков - 5592203657216 bytes (5.6 TB) copied, 3784.57 s, 1.5 GB/s (пока их 20)
- 24 потока - 6714306854912 bytes (6.7 TB) copied, 8835.18 s, 760 MB/s (пока их 20)
- 32 потока - 5862605193216 bytes (5.9 TB) copied, 8141.34 s, 720 MB/s (пока их 24)
Проверка деградации (чтение tarnull) после полутора лет эксплуатации под хранилище томов bacula
(большие и очень большие файлы, XFS, LVM
над LSI MegaRAID 9266-8i - 2 RAID-6 по 18 дисков, SAS 4TB, rdcache=RA, iopolicy=Cached):
- 1 поток - 10104413880320 bytes (10 TB) copied, 9822.86 s, 1.0 GB/s
- 2 потока - 16951939170304 bytes (17 TB) copied, 17398.4 s, 974 MB/s
- 4 потока - 10740585988096 bytes (11 TB) copied, 7771.81 s, 1.4 GB/s
- 6 потоков - 37457503453184 bytes (37 TB) copied, 27914.8 s, 1.3 GB/s
- 8 потоков - 20083290144768 bytes (20 TB) copied, 14405.3 s, 1.4 GB/s
- 10 потоков - 13290862280704 bytes (13 TB) copied, 9638.1 s, 1.4 GB/s
- 12 потоков - 18429180379136 bytes (18 TB) copied, 15934.9 s, 1.2 GB/s
- 16 потоков - 20072395440128 bytes (20 TB) copied, 22512.1 s, 892 MB/s
- 20 потоков - 19661230964736 bytes (20 TB) copied, 24707.8 s, 796 MB/s (пока их 16)
- 24 потока - 8341583560704 bytes (8.3 TB) copied, 9555.3 s, 873 MB/s (пока их 16)
- 32 потока - 5574189121536 bytes (5.6 TB) copied, 7060.46 s, 789 MB/s (пока их 24)
Вывод: при восстановлении малым количеством потоков необходимо включать кеширование и предварительное чтение.
|
Bog BOS: Файловая система XFS (Linux)
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru