![Какие файловые системы Linux поддерживают предварительное выделение целых файлов для уменьшения фрагментации файлов Torrent/Gnutella?](https://rvso.com/image/231082/%D0%9A%D0%B0%D0%BA%D0%B8%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D1%8B%D0%B5%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B%20Linux%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E%D1%82%20%D0%BF%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B5%D0%BB%D1%8B%D1%85%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20Torrent%2FGnutella%3F.png)
Насколько я понимаю, по крайней мере, в файловой системе Linux ext3, когда создается большой файл, блоки фактически не выделяются на диске, пока данные не будут фактически записаны в эту часть файла. Linux делает то же самое, когда программы выделяют память, где выделения ленивые и страницы фактически не выделяются, пока данные не будут записаны в них, но это уже другая тема.
Когда программы обмена файлами, такие как Bittorrent и Gnutella, записывают файлы, они записывают небольшие блоки в случайные области файла. Файловая система Linux размещает эти части файла по всему диску, создавая большую фрагментацию. При записи в несколько файлов одновременно, как в этом случае, проблема становится особенно серьезной. Даже выбор предварительного выделения файлов в программе обмена файлами, похоже, не помогает. Возможность читать эти файлы со скоростью всего 10 МБ/с является типичной для такого количества фрагментации. Утилиту filefrag можно использовать для просмотра количества фрагментов в файле. Файл типа /var/log/messsages является хорошим местом для тестирования.
В ext3, как, я полагаю, и в большинстве других файловых систем Linux, некоторые данные фактически приходится записывать во весь файл, чтобы от начала до конца фактически иметь полностью выделенный файл с минимальной фрагментацией.
Я мог бы попробовать смонтировать том NTFS в Linux, но должен быть способ получше! Есть ext4, btrfs, xfs, jfs, ReiserFS, ExFAT и даже FAT32, которые стоит рассмотреть! Есть ли у кого-нибудь из них предварительное распределение файлов или, по крайней мере, API, позволяющее делать это без предварительной записи данных во весь файл?
решение1
В 2024 году следующие файловые системы Linux поддерживают предварительное распределение файлов posix_fallocate()
:
Локальные файловые системы:
- bcachefs (на данный момент экспериментальный, не рекомендуется для общего использования)
- btrfs
- ext4/ext3
- F2FS
- NTFS3 (
prealloc
для включения функции необходимо указать параметр монтирования) - VFAT/FAT32
- XFS
Сетевые файловые системы:
- ГФС2
- НФС
- OCFS2
- CIFS/САМБА
Важные соображения:
- Приложение должно использовать эту функцию.
- Предварительное распределение может не дать оптимальных результатов, если ваша файловая система уже [сильно] фрагментирована и в ней нет дыр достаточного размера.
- При наличии достаточного свободного места для правильного выравнивания файлов:
- В Linux полностью дефрагментировать можно только XFS (то есть можно дефрагментировать и свободное пространство)
- В Windows вы, очевидно, можете полностью дефрагментировать NTFS/VFAT.