Назад | Перейти на главную страницу

Варианты повышения производительности на очень больших файловых системах и высоком IOWAIT

У меня есть резервный сервер Ubuntu 16.04 с жестким диском 8x10 ТБ через объединительную плату SATA 3.0. 8 жестких дисков собраны в RAID6, используется файловая система EXT4. Эта файловая система хранит огромное количество небольших файлов с очень большим количеством операций SEEK, но с низкой пропускной способностью ввода-вывода. На самом деле существует множество небольших файлов с разных серверов, которые снимаются с помощью rsnapshot каждый день (несколько INODES направлены на одни и те же файлы. У меня очень низкая производительность, поскольку файловая система (60 ТБ нетто) превышает 50% использования. использование составляет 75%, а

du -sch /backup-root/

занимает несколько дней (!). Машина имеет 8 ядер и 16 ГБ оперативной памяти. Оперативная память полностью используется кэшем файловой системы ОС, 7 из 8 ядер всегда простаивают из-за IOWAIT.

Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          5af205b0-d622-41dd-990e-b4d660c12bd9
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              912203776
Block count:              14595257856
Reserved block count:     0
Free blocks:              4916228709
Free inodes:              793935052
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         2048
Inode blocks per group:   128
RAID stride:              128
RAID stripe width:        768
Flex block group size:    16
Filesystem created:       Wed May 31 21:47:22 2017
Last mount time:          Sat Apr 14 18:48:25 2018
Last write time:          Sat Apr 14 18:48:18 2018
Mount count:              9
Maximum mount count:      -1
Last checked:             Wed May 31 21:47:22 2017
Check interval:           0 (<none>)
Lifetime writes:          152 TB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       513933330
Default directory hash:   half_md4
Directory Hash Seed:      5e822939-cb86-40b2-85bf-bf5844f82922
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke journal_64bit
Journal size:             128M
Journal length:           32768
Journal sequence:         0x00c0b9d5
Journal start:            30179

Мне не хватает опыта использования такого рода файловой системы. Какие варианты у меня есть, чтобы это настроить. Какая файловая система будет лучше работать в этом сценарии? Есть ли какие-либо варианты использования ОЗУ для других вариантов кеширования, кроме встроенного в ОС?

Как вы обрабатываете очень большие объемы маленьких файлов на больших сборках RAID?

Спасибо, Себастьян

У меня есть аналогичная (хотя и меньшая) установка с 12 дисками по 2 ТБ в массиве RAID6, которые используются для той же цели (rsnapshot резервный сервер).

Во-первых, это нормально для du -hs уделять так много времени такой большой и используемой файловой системе. более того du учитывает жесткие ссылки, которые вызывают значительную и резкую загрузку ЦП в дополнение к очевидной нагрузке ввода-вывода.

Ваша медлительность связана с тем, что метаданные файловой системы расположены в очень удаленных (в терминах LBA) блоках, что вызывает много запросов. Поскольку обычный диск со скоростью вращения 7,2 КБ обеспечивает около 100 операций ввода-вывода в секунду, вы можете увидеть, сколько часов, если не дней, необходимо для загрузки всех метаданных.

Что-то, что вы можете попробовать (неразрушающим образом) улучшить ситуацию:

  • обязательно не имея mlocate/slocate индексация вашего /backup-root/ (вы можете использовать предприятие Prunefs чтобы избежать этого), иначе удаление кэша метаданных серьезно снизит время резервного копирования;
  • по той же причине избегайте бега du на /backup-root/. При необходимости запустите du только в конкретной интересующей подпапке;
  • ниже vfs_cache_pressure от значения по умолчанию (100) до более консервативного (10 или 20). Это укажет ядру отдать предпочтение кэшированию метаданных, а не кэшированию данных; это, в свою очередь, должно ускорить rsnapshot/rsync фаза открытия;
  • вы можете попробовать добавить устройство кэширования метаданных с возможностью записи, например, через lvmcache или bcache. Этим устройством метаданных, очевидно, должен быть SSD;
  • увеличьте доступную оперативную память.
  • поскольку вы используете ext4, помните о проблемах с распределением inode (прочтите Вот для примера). Это не связано напрямую с производительностью, но это важный фактор, когда в файловой системе на основе ext имеется так много файлов.

Вы можете попробовать и другие вещи, но это разрушительные операции:

  • используйте XFS с обоими -ftype и -finobt набор опций;
  • использовать ZFS в Linux (ZoL) со сжатым ARC и primarycache=metadata настройка (и, возможно, L2ARC для кеша только для чтения).

Эта файловая система хранит огромное количество небольших файлов с очень большим количеством операций SEEK, но с низкой пропускной способностью ввода-вывода.

🎉

Это то, что сейчас привлекает множество людей. Увы, обычные FS здесь плохо масштабируются. Я могу дать вам, наверное, всего несколько советов, когда дело доходит до уже имеющейся настройки: EXT4 через RAID-6 на жестких дисках:

  1. Нижняя vm.vfs_cache_pressure вниз, скажем 1. Это было бы изменить предвзятость кеширования к сохранению большего количества метаданных (inode, dentry) вместо самих данных, и это должно иметь положительный эффект в сокращении количества поисков
  2. Добавить больше RAM. Хотя это может показаться странным для сервера, на котором не работают какие-либо копилки, помните: единственный способ уменьшить количество запросов - хранить больше метаданных в более быстром хранилище, учитывая, что у вас есть только 16 ГБ, кажется, что это должно быть относительно легко увеличить объем оперативной памяти
  3. Как я уже сказал, EXT4 - не лучший выбор для вашего варианта использования, но все же вы можете использовать некоторые из его функций, чтобы облегчить боль:
    • внешний журнал поддерживается, поэтому вы можете попробовать добавить SSD (лучше зеркальный) и разместить там журнал. Проверять, выписываться "ext4: предупреждения о внешнем журнале"
    • Попробуйте переключиться режим журнала к "ведению журнала всех данных" монтаж с data=journal
  4. Пытаться перемещение файлов за пределы единой области FS. Для е. g., если у вас здесь LVM-2, вы можете создавать тома меньшего размера и использовать их какое-то время, затем, когда он заполнится, создайте еще один и так далее.
    • Если у вас нет LVM-2, вы можете попробовать сделать это с помощью / dev / loop, но это не так удобно и, вероятно, менее производительно.

UPD.: так как оказалось Программный RAID Linux (LSR) RAID-6, вот дополнительный элемент:

  1. LSR имеет собственные параметры настройки, которые многие люди, кажется, упускают из виду.

- Это, наверное, большая часть того, что можно улучшить без редизайна с нуля.

У меня очень низкая производительность, так как файловая система (нетто 60 ТБ) превысила 50% использования. На данный момент загрузка составляет 75%

Это очень серьезная проблема, потому что высокий уровень занятости дискового пространства только усугубляет фрагментацию. А чем больше фрагментация, тем больше поисков. Не удивительно, почему он давал более или менее приемлемую производительность до достижения 50%. Во многих руководствах есть четкие рекомендации, чтобы ФБК не разрастались ниже 75–80%.

В этом случае RAID6 не особо поможет, что-то вроде ZFS может обеспечить гораздо более быстрый доступ к метаданным и каталогам при сохранении примерно такой же скорости.

RAID-6 чередует диски, поэтому весь ввод-вывод идет на все диски. Это довольно неэффективно для множества небольших файлов. Однако, вероятно, это не ваша главная проблема, которая ...

Ext4 не очень подходит для больших файловых систем с миллионами файлов. Использовать XFS. У меня есть файловые системы XFS размером до 1,2 ПБ и с 1 миллиардом файлов, без проблем. Просто используйте XFS.

Спасибо всем, кто ответил на мой вопрос.

Вот как я это решил:

Первым делом я добавил на плату максимальный объем оперативной памяти. К сожалению, плата поддерживает только до 64 ГБ оперативной памяти. Я наблюдал за поведением после расширения, и оно меня разочаровало. Хотя вся доступная оперативная память использовалась для кэша ввода-вывода, производительность RSNAPSHOT-Backup заметно не улучшилась.

Так что мне пришлось вытащить большую булаву. Я добавил два диска NVME емкостью 1 ТБ и собрал их в RAID 1. RAID 6, состоящий из 8 жестких дисков по 10 ТБ, был разобран на один RAID 1 (состоящий из 2 жестких дисков по 10 ТБ, ext4) и один RAID 5 (состоящий из 6 жестких дисков по 10 ТБ). RAID 1 теперь содержит операционную систему и рабочую копию серверов (которые загружаются на этот диск 4 раза в день).

RAID5 теперь является устройством с поддержкой BCACHE, поддерживаемым NVME-RAID 1 и отформатированным с помощью ext4. На этом диске находятся копии RSNAPSHOT. Каждую ночь файлы синхронизируются с RAID1 на RAID5, что снижает вдвое пропускную способность ввода-вывода RAID5 по сравнению с предыдущим RAID6, который содержал рабочие копии И резервные копии. Благодаря BCache не буквально каждый файл записывается на диски, но все изменения в одном блоке записываются один раз, даже если он содержит несколько сотен изменений одного файла. Это еще больше снизило количество операций ввода-вывода на жестких дисках.

Наконец, я изменил конфигурацию RSnapshot. Раньше было 31 ежедневный снимок и 18 ежемесячных снимков, в результате чего было создано 49 резервных копий. Теперь у меня есть классический дизайн 7d / 4w / 12m / 1y, который сокращает количество генераций резервных копий до 24.

После этих изменений (и с 64 ГБ ОЗУ, упомянутой выше) продолжительность одного снимка снизилась с ~ 20 часов до 1,5 часов. Уровень попадания в кэш-память устройств BCache составляет 82% (после 6 недель нормальной работы).

Миссия выполнена. Спасибо всем за ваши мысли и вклад.