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

файловая система для миллионов небольших файлов

Для какой файловой системы Linux вы бы выбрали лучшая скорость в следующем сценарии:

Примечание: Файлы хранятся в глубоком иерархическом дереве, чтобы избежать больших каталогов. Каждый листовой каталог содержит около тысячи файлов.

Как бы вы его оценили?

Что касается случайных поисков, то побеждает Райзер, за ним следует EXT4, а затем JFS. Я не уверен, будет ли это точно коррелировать с поиском в каталогах, но похоже, что это индикатор. Для этого вам придется провести свои собственные тесты. EXT2 превосходит все по времени создания файлов, вероятно, из-за отсутствия журнала, тем не менее EXT4 превосходит все, кроме Reiser, который вы, возможно, не захотите использовать из-за текущего статуса Ханса Райзера.

Возможно, вы захотите изучить диски, поддерживающие NCQ, и убедиться, что ваша установка настроена для его использования. При сильном поиске он должен давать прирост скорости.

Наконец, убедитесь, что в вашей машине много гидроцилиндров. Поскольку файлы не часто обновляются, Linux в конечном итоге кэширует большинство из них для оперативной памяти, если у них есть свободное место. Если ваши шаблоны использования верны, это даст вам огромный прирост скорости.

Я согласен с большей частью того, что сказал Эндрю, за исключением того, что я бы рекомендовал Reiser4 или старше (но лучше поддерживается) ReiserFS. Как показывают эти тесты (и документация для ReiserFS), он разработан для конкретной ситуации, о которой вы спрашиваете (большое количество небольших файлов или каталогов). Раньше я без проблем использовал ReiserFS с Gentoo и Ubuntu.

Что касается статуса Ханса Рейзера, я не считаю, что это проблема с кодом или стабильностью самой файловой системы. Reiser4 даже спонсируется как DARPA, так и Linspire, поэтому, хотя я согласен с тем, что дальнейшее развитие файловой системы Reiser не определено, я не считаю, что это должно быть решающим фактором в отношении того, следует ли кому-либо использовать ее или нет.

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

Кто-то из Unix StackExchange создал тест (с исходным кодом) для тестирования только этого сценария:

В: Какая файловая система Linux является наиболее производительной для хранения большого количества небольших файлов (HDD, а не SSD)?

Похоже, что лучшая производительность чтения обеспечивается ReiserFS.

По моему опыту, ext2 выдувает ext4 из воды для небольших файлов. Если вас не волнует целостность записи, это здорово. Например, subversion создает много-много-много маленьких файлов, которые блокируют ext4 и другие файловые системы (XFS) (запуск задания cron, который синхронизирует данные с ext4 из ext2 каждые полчаса или около того, практически решает проблему).

Выполнение этих команд делает ext2 еще быстрее (хотя большинство из этих опций делают файловую систему нестабильной после сбоя, если вы не запустите синхронизацию до ее сбоя). Эти команды почти не влияют на ext4 с небольшими файлами.

echo 15 > /proc/sys/vm/swappiness
echo 10 > /proc/sys/vm/vfs_cache_pressure
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
echo "2000" > /proc/sys/vm/vfs_cache_pressure

Думаю, ext3 (или ext4), возможно, JFS будет хорошим решением. Я бы с осторожностью относился к ext4 и btrfs (файловые системы сложны - будьте готовы к резервным копиям, если вы хотите использовать самые свежие, новейшие вещи).

Также есть различные параметры, которые вы можете настроить во время mkfs, чтобы настроить файловую систему по своему вкусу.

Я определенно рекомендую против XFS. Не потому, что это плохая файловая система, но создание / удаление - дорогостоящая операция.


Чтобы избежать проблем с поиском в каталогах, используйте интеллектуальную схему именования, например:

<first letter of id>_<last letter of id>/<id>

или аналогичные, более сложные схемы. Это ускорит поиск в каталоге и, следовательно, общую скорость доступа. (Это старый трюк с Unix, я думаю, вернувшись из V7)

Большинство FS захлебнутся, если в каталоге больше 65K файлов, я думаю, что это все еще верно для ext4. Файловые системы Reiser не имеют этого ограничения (ребята на mp3.com заплатили, чтобы убедиться в этом). Не уверен ни в чем другом, но это один из сценариев использования, для которых была создана ReiserFS.