Я хотел бы сделать ls -laR /media/myfs
в Linux как можно быстрее. У меня будет 1 миллион файлов в файловой системе, 2 ТБ общего размера файла и несколько каталогов, содержащих до 10000 файлов. Какую файловую систему мне использовать и как ее настроить?
Насколько я понимаю, причина, по которой ls -laR
медленная, потому что он должен иметь stat(2)
каждого inode (т.е. 1 миллион stat(2)
s), а также потому, что inode распределяются случайным образом на диске, каждый stat(2)
нужен один диск искать.
Вот некоторые решения, которые я имел в виду, и ни одно из которых меня не устраивает:
Создайте файловую систему на SSD, потому что операции поиска на SSD выполняются быстро. Это не сработает, потому что твердотельный накопитель емкостью 2 ТБ не существует или он слишком дорогой.
Создайте файловую систему, которая охватывает два блочных устройства: SSD и диск; диск содержит данные файла, а SSD содержит все метаданные (включая записи каталога, inode и расширенные атрибуты POSIX). Есть ли файловая система, которая поддерживает это? Выдержит ли это системный сбой (перебои в подаче электроэнергии)?
Используйте
find /media/myfs
в ext2, ext3 или ext4 вместоls -laR /media/myfs
, поскольку первое может использовать преимущество поляd_type
(см. Справочную страницуgetdents(2)
), поэтому оно не должны стат. К сожалению, это не соответствует моим требованиям, потому что мне нужны также файлы всех размеров, которые неfind /media/myfs
.Используйте файловую систему, такую как VFAT, которая хранит inode в записях каталога. Я хотел бы этого, но VFAT не достаточно надежен и гибок для меня, и я не знаю ни одной другой файловой системы, которая делает это. Вы? Конечно, хранение inode в записях каталога не будет работать для файлов с количеством ссылок больше 1, но это не проблема, поскольку в моем случае использования у меня всего несколько десятков таких файлов.
Настройте некоторые параметры в
/proc
илиsysctl
так, чтобы inode был навсегда заблокирован в системной памяти. Это не ускорит первыеls -laR /media/myfs
, но сделает все последующие вызовы удивительно быстрыми. Как я могу это сделать? Мне не нравится эта идея, потому что она не ускоряет первый вызов, который в настоящее время занимает 30 минут. Также я бы хотел заблокировать расширенные атрибуты POSIX в памяти. Что я должен сделать для этого?Используйте файловую систему, которая имеет онлайн-инструмент для дефрагментации, который может быть инструктирован для перемещения inode в начало блочного устройства. Как только перемещение выполнено, я могу запустить
dd if=/dev/sdb of=/dev/null bs=1M count=256
чтобы получить начало блочного устройства, извлеченного в кэш-память ядра без поиска, а затем Операцииstat(2)
будут быстрыми, потому что они читают из кеша. Есть ли способ заблокировать эти inode и / или блоки в памяти после их чтения? В какой файловой системе есть такой инструмент дефрагментации?