Поскольку операции чтения с диска имеют размер блока (а ext * не поддерживает перераспределение блоков), если у вас просто есть куча крошечных файлов, которые даже близко не подходят для заполнения блока самостоятельно, вы было бы лучше объединить их в архивы. Это не может быть выигрыш, если вы не можете сгруппировать связанные файлы вместе.
Рассмотрим ext4? Параметр dir_index
в ext3 является стандартным в ext4 и ускоряет работу с большим количеством файлов в одном каталоге. Он размещает метаданные, каталоги и файловые блоки гораздо более последовательно на диске и значительно уменьшает количество блоков, не относящихся к данным, необходимых для отслеживания каждого блока данных (хотя это имеет большее значение для больших файлов, чем для маленьких). Есть предложение вставить данные небольшого файла в его inode, но я не думаю, что это в восходящем потоке.
Если вы ограничены поиском (в отличие от полосы пропускания), это может помочь вызвать fadvise(FADV_WILLNEED)
для набора файлов перед чтением из любого из них. Ядро воспринимает это как подсказку для чтения в файловый кеш. Тем не менее, будьте осторожны: чтение вперед больше, чем может вместить кэш, расточительно и медленнее. Есть предложение добавить fincore
, чтобы определить, когда ваши файлы были выселены, но я не думаю, что это еще и апстрим.
Если окажется, что вы ограничены пропускной способностью, сжатие файлов с помощью LZO или gzip может помочь. Процессор по-прежнему должен быстрее распаковываться, чем диск читает с этими методами сжатия (в отличие от LZMA или bzip2).