4

У меня есть набор файлов, которые я хочу разместить в файловой системе непрерывно. Я буду получать доступ ко всем этим файлам последовательно в одном чтении один за другим, и я хочу оптимизировать их чтение. Я не могу объединить их в один файл, и я ищу решение, которое позволит им быть отдельными файлами.

Я использую файловую систему ext4, и мне было интересно, есть ли какой-нибудь существующий инструмент, который мог бы сделать это для меня, когда я узнал, что ext4 поддерживает онлайн-обмен и дефрагментацию блоков. Я попытался использовать e4defrag в моем каталоге файлов, хотя он гарантировал, что каждый отдельный файл был дефрагментирован, каждый сам файл находился в отдельном блоке, не обязательно смежном с другими файлами. (Я использовал filefrag -v file_name чтобы проверить, расположены ли они рядом друг с другом или нет)

РЕДАКТИРОВАТЬ: просто чтобы уточнить шаблоны доступа к файлам, эти файлы будут записаны ровно один раз и никогда не изменятся снова. Они будут часто читаться, но таким образом, что, если какой-либо из них будет прочитан, все другие файлы в наборе также, вероятно, понадобятся для чтения. Что я собираюсь сделать, так это предварительно загрузить все эти файлы вместе в буфер / кэш файловой системы за один раз, чтобы последующие случайные чтения любого из этих файлов были действительно быстрыми. (Общий размер файла достаточно мал, 100 ~ 200 МБ, чтобы поместиться в кэш). Сейчас я пытаюсь улучшить производительность чтения при попытке загрузить эти файлы в кеш. В настоящее время производительность чтения сильно падает при попытке предварительного извлечения их в кэш, так как существует несколько обращений к диску, поскольку они расположены в непересекающихся сегментах.

1 ответ1

0

Не совсем способ реорганизации блоков файловой системы, но ...

Вы хотите, чтобы файлы были в оперативной памяти, и вы сказали в комментариях, что вы уже экспериментировали с ramdisk. Мы можем улучшить этот подход.

Моя идея - читать файлы не напрямую из файловой системы, такой как ext4 а из файла .tar . Вы должны создать этот файл один раз, поместить его в файловую систему ext4 и выполнить дефрагментацию с помощью e4defrag . Тогда при каждой загрузке

cd /mnt/target_tmpfs/ &&  tar -xf /mnt/ext4/defragmented_archive.tar

Я не думаю, что tar будет смотреть в данном файле, искать туда-сюда. Но если вы так думаете, то всегда можете использовать cat … | tar -x . В этом случае tar может читать свои входные данные только непрерывно и не более одного раза.

Я знаю, что вы не можете легко загрузить всю ОС таким способом, если, возможно, вы не подготовите initramfs для этого. Я не знаю много об этом, но я нашел это: Пользовательские Initramfs. Оттуда:

Вот несколько примеров того, что вы можете сделать с initramfs:

  • Смонтировать корневой раздел (для зашифрованных, логических и других специальных разделов);
  • [...]

Смотрите примеры сценариев там. Монтирование ext4 , затем tmpfs и заполнение его из .tar , затем использование этого как / - все это кажется возможным в общем.

Очевидно, вы хотите, чтобы ваш custom-initramfs.cpio.gz был дефрагментирован так же, как и файл .tar .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .