Моя файловая система ext4 теряет производительность при росте.
У меня есть система, хранящая много файлов изображений. Этот сервер изображений на основе Debian хранит файлы изображений, разделенные по папкам года, на наборах дисков объемом 1-2 ТБ с аппаратным RAID-1. Файлы хранятся в структуре папок года и двух уровнях по 256 папок ниже этого.
Нравиться
images/2021/2b/0f/193528211006081503835.tif
Файлы записываются непрерывно в течение года и равномерно распределяются с помощью хэша, поэтому каждая папка листа/изображения
содержит около 400 файлов на конец года.
Это дает в общей сложности около 256 x 256 x 400 = 26 214 400 файлов в год.
Итерация этой структуры папок хорошо работает примерно до 20 миллионов файлов.
Это занимает, может быть, несколько часов. При увеличении размера даже листинг листовой папки с 300-400 файлами может занять 1-4 секунды, если он не находится в кеше. Я подозреваю, что это как-то связано с фрагментацией в записях каталога.
Доступ к отдельному файлу, когда вы знаете путь, всегда быстрый.
И это не проблема с оборудованием/диском, производительность необработанного ввода-вывода хорошая. Кстати, файлы из этой структуры никогда не удаляются.
Дефрагментация с помощью e4defrag ничего не меняет. Я полагаю, что он дефрагментирует только файлы, а не каталоги. fsck.ext4 -D может быть решением, но, поскольку это производственная система, я не хочу размонтировать файловую систему и пытаться.
Что действительно помогает, так это копирование файлов во временную папку, а затем их перемещение обратно с перезаписью оригинала. Нравиться
cp -a изображения/2021/2b/0f/* изображения/2021/2b/tmp
mv -f изображения/2021/2b/tmp/* изображения/2021/2b/0f
После этой операции производительность восстанавливается (даже если не в кеше).
Если бы сами файлы были фрагментированы, я понимаю, почему это помогло бы, но это не соответствует e4defrag.Перемещение файлов во временную папку и обратно не помогает.
Может ли кто-нибудь помочь мне понять, что здесь происходит.