- Bog BOS: Файловая система XFS (Linux)
- XFS (Русский)
- Contents
- Установка
- Повреждение данных
- Восстановление файловой системы XFS
- Проверка метаданных «на лету» (scrub)
- Целостность
- Администрирование
- Изменение размера
- Производительность
- Размер и ширина полосы (stripe)
- Время доступа
- Дефрагментация
- Проверка уровня фрагментации
- Выполнение дефрагментации
- B-дерево со свободными inode-ами
- Внешний журнал XFS
- Интервал синхронизации
- Решение проблем
- Квота корневой файловой системы
- xfs_scrub_all отказывается работать, если пользователь «nobody» не может получить доступ к точке монтирования
Bog BOS: Файловая система XFS (Linux)
Журналируемая файловая система xfs позволяет использовать блочные устройства размером более 16ТБ (пакеты xfsprogs и xfsdump), первоначально была разработана для SGI IRIX, поддерживает расширенные атрибуты файлов, выделение места экстентами, эффективное распараллеливание за счёт разбиения области данных на независимые отсеки. Является файловой системой по умолчанию в RHEL 7. Не очень любит мелкие файлы. Предпочтительна при большом количестве потоков доступа.
- состоит из секций данных (содержит метаданные и может содержать журнал), журнала и секции для работы в реальном времени
- секция данных делится на равные группы блоков (allocation groups), количество которых определяет уровень параллелизма при выделении места; каждая группа содержит суперблок, управление свободным пространством группы, таблицу inode (создаются по потребности), данные
- размер блока в Linux — 4 КБ
- выделение места происходит экстентами (до 8 GiB)
- ранее не подходила для хранения большого количества мелких файлов (почтовый сервер) — медленно работает с метаданными; постепенно улучшается
- открытые в момент неожиданного выключения компьютера файлы будут заполнены нулями (исправлено)
- мгновенное создание и расширение файловой системы при нулевых накладных расходах (у ext4 — 1.5%, т.е. 269GB для 16ТБ) и примерно сравнимых с ext4 накладных расходах при хранении файлов (на 0.07% меньше для набора в 10TB из 10 миллионов файлов
- 64-битные номера inode для файловой системы размером 2ТиБ и более, не все 32-битные программы это переживут ; исправлено в RHEL7
Ключи утилиты mkfs.xfs:
- -L метка-файловой-системы # до 12 символов
- -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
- uquota/usrquota/uqnoenforce/quota/gquota/grpquota/gqnoenforce/pquota/prjquota/pqnoenforce
- sunit=размер-страйпа-RAID-в-секторах
- swidth=ширина-страйпа-RAID-в-секторах # размер-страйпа X число-дисков-данных
- swalloc # округлять выделяемое место по swidth
Статистика и ручки управления:
- /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 миллиона кусочков).
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.
Раздел под резервное копирование bacula поверх автономного дискового массива HP StorageWorks MSA P2000 G3 (FC)
- подключить дисковый массив к контроллеру FibreChannel
- создать 2 массива RAID-6 (12x2TB) по 20TB, LUN во весь размер на каждом (24 диска в 1 LUN не умеет)
- создать логический том
- создать файловую систему
- монтирование (/etc/fstab)
- настройки в /etc/rc.local
- проверка скорости (линейная скорость ограничена здесь FC контроллером на 4Gb)
- множество примеров скоростных характеристик в статье про 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)
Вывод: при восстановлении малым количеством потоков необходимо включать кеширование и предварительное чтение.
Источник
XFS (Русский)
XFS — высокопроизводительная журналируемая файловая система, созданная Silicon Graphics, Inc. XFS особенно хорошо справляется с параллельным вводом-выводом благодаря структуре на основе заголовков для групп (allocation groups), что обеспечивает исключительную масштабируемость потоков ввода-вывода, пропускной способности файловой системы, размера файлов и файловой системы при работе с несколькими устройствами хранения.
Contents
Установка
Установите пакет xfsprogs для получения утилит XFS в пространстве пользователя. Данный пакет содержит средства, необходимые для управления файловой системой XFS.
Повреждение данных
В случае повреждения данных по какой-либо причине придётся восстанавливать файловую систему вручную.
Восстановление файловой системы XFS
Сначала размонтируйте файловую систему XFS.
После размонтирования запустите утилиту xfs_repair(8) .
Проверка метаданных «на лету» (scrub)
xfs_scrub запрашивает ядро очистить (англ. scrub) все объекты метаданных в XFS.Записи метаданных сканируются на очевидно ошибочные значения, после чего перекрёстно ссылаются на остальные метаданные. Это делается для того, чтобы иметь достаточно уверенности в целостности всей файловой системы, анализируя отдельные записи метаданных на фоне остальных метаданных в файловой системе. Повреждённые метаданные можно восстановить из других метаданных при наличии неповреждённых избыточных структур данных.
Включите и запустите xfs_scrub_all.timer для периодической проверки метаданных всех файловых систем XFS «на лету».
Целостность
В xfsprogs 3.2.0 появился новый дисковый (англ. on-disk) формат (v5), включающий в себя схему контрольных сумм метаданных — Self-Describing Metadata. Она основывается на CRC32 и обеспечивает, к примеру, дополнительную защиту от повреждения метаданных при непредвиденном отключении электропитания. Контрольная сумма включена по умолчанию начиная с xfsprogs 3.2.3. Если требуется монтируемый для чтения-записи раздел XFS на более старом ядре, данная функция легко отключается с помощью параметра -m crc=0 при вызове mkfs.xfs(8) .
Дисковый (англ. on-disk) формат XFS v5 считается стабильным для промышленной эксплуатации начиная с ядра Linux 3.15.
Администрирование
Изменение размера
XFS позволяет изменять размер файловой системы «на лету». Достаточно выполнить xfs_growfs с указанием точки монтирования, что расширит файловую систему до максимально возможного размера.
Производительность
Просто создайте файловую систему XFS, чтобы достичь оптимальной скорости:
Смотрите также xfs(5) для получения информации о доступных параметрах монтирования.
Размер и ширина полосы (stripe)
Если файловая система будет использоваться на чередующемся RAID-массиве, можно значительно повысить скорость, указав размер полосы (англ. stripe) в команде mkfs.xfs(8) .
XFS иногда определяет «геометрию» программного RAID-массива, но если она изменяется или используется аппаратный RAID, то см. статью «How to calculate the correct sunit,swidth values for optimal performance» (англ.).
Время доступа
В некоторых файловых системах можно повысить производительность, добавив параметр монтирования noatime в файле /etc/fstab . Для XFS стандартным поведением atime является relatime , которое почти не имеет накладных расходов по сравнению с noatime, но при этом сохраняет нормальные значения atime. Все файловые системы Linux теперь используют это в качестве значения по умолчанию (примерно с версии 2.6.30), но XFS использует relatime-поведение с 2006 года, поэтому нет никакой необходимости использовать noatime по соображениям производительности.
Кроме того, noatime подразумевает nodiratime , поэтому нет необходимости указывать nodiratime при уже заданном noatime.
Дефрагментация
Хотя основанная на экстентах природа XFS и используемая стратегия отложенного размещения значительно повышают устойчивость файловой системы к проблемам фрагментации, XFS предоставляет утилиту xfs_fsr (сокращение от «реорганизатора файловой системы XFS») для дефрагменентации файлов на смонтированной и активной файловой системе XFS. Также полезно периодически проверять фрагментацию XFS.
xfs_fsr(8) улучшает организацию смонтированных файловых систем. Алгоритм реорганизации работает с одним файлом за раз, сжимая или улучшая размещение экстентов файла (последовательных блоков данных файла).
Проверка уровня фрагментации
Проверить уровень фрагментации в данный момент можно следующей командой:
Выполнение дефрагментации
Используйте команду xfs_fsr(8) , чтобы начать дефрагментацию:
B-дерево со свободными inode-ами
Начиная с Linux 3.16, в XFS появилось B-дерево для отслеживания свободных inode, что равноценно существующему B-дереву для распределения индексных дескрипторов, за исключением того, что отслеживаются inode-блоки по крайней мере с одним свободным inode. Это делается для того, чтобы ускорить поиск свободных inode-кластеров при распределении inode. Также это повышает производительность старых файловых систем, например, спустя месяцы или годы после добавления и удаления миллионов файлов на файловой системе. Использование этой функции не влияет на общий уровень надёжности ФС или возможность восстановления.
Данная функция основывается на новом дисковом (on-disk) формате XFS v5, который считается стабильным для промышленной эксплуатации начиная с ядра Linux 3.15. Она не изменяет существующие дисковые структуры, но добавляет новую, которая должна оставаться целостной в B-дереве для отслеживания свободных inode. По этой же причине более старые версии ядра монтируют файловые системы с B-деревом свободных inode только в режиме для чтения.
Также данная функция включена по умолчанию начиная с xfsprogs 3.2.3. Если требуется возможность записи на файловую систему при использовании более старого ядра, отключите её с помощью параметра finobt=0 при форматировании XFS-раздела. crc=0 указывается вместе с предыдущим параметром.
или короче ( finobt зависит от crc )
Внешний журнал XFS
Использование внешнего лога (журнала метаданных), например, на SSD (Русский), может улучшить производительность [1]. См. mkfs.xfs(8) для получения информации о параметре logdev .
Укажите опцию -l logdev=device,size=size команде mkfs.xfs для резервации внешнего журнала определённого размера при создании файловой системы XFS. Если пропустить параметр size , размер журнала будет зависеть от размера ФС. Укажите опцию -o logdev=device команде mount для монтирования XFS с использованием внешнего журнала.
Интервал синхронизации
В XFS существует отдельная переменная sysctl для настройки интервала обратной записи (англ. writeback interval). По умолчанию в Arch используется значение «3000». Возможно также задать и большее значение, однако стоит учитывать, что слишком большое значение может привести к потери данных в некоторых случаях:
Решение проблем
Квота корневой файловой системы
Параметры монтирования XFS ( uquota , gquota , prjquota и т.д.) не выполняются во время повторного монтирования файловой системы. Чтобы включить квоту корневой файловой системы, параметр монтирования должен быть передан initramfs как параметр ядра rootflags= . Впоследствии его не следует указывать среди параметров монтирования в /etc/fstab для корневой ( / ) файловой системы.
xfs_scrub_all отказывается работать, если пользователь «nobody» не может получить доступ к точке монтирования
При запуске xfs_scrub_all также запускается xfs_scrub@.service для каждой примонтированной файловой системы XFS. Данная служба запускается от пользователя nobody и соответственно, если nobody не может перейти в директорию, команда завершится со следующей ошибкой:
Чтобы разрешить запуск службы, измените разрешения точки монтирования таким образом, чтобы у пользователя nobody были права на выполнение.
Источник