
Расширение файлов на FAT32 в тесте Linux 7.4-rc2 ускорилось в 162 раза
В основную ветку ядра Linux приняли оптимизацию FAT32 для версии 7.4-rc2. В самом удачном тесте разработчика Матеуса Алвеса де Алмейды расширение 16 файлов заняло 0,362 секунды вместо 58,66 секунды. Результат 162,15× получен в виртуальной машине на разделе с кластерами по 512 байт, смонтированном с параметром sync.
Как изменили выделение места на FAT32
При увеличении файла драйвер FAT выделял кластеры небольшими порциями. При синхронном монтировании такие операции особенно затратны из-за частого обновления таблицы размещения файлов. После патча fat_cont_expand() заранее резервирует нужные кластеры через новую функцию fat_preallocate(). Её использует и fat_fallocate() с флагом FALLOC_FL_KEEP_SIZE, который позволяет резервировать место без изменения видимого размера файла.
Что показали тесты FAT32 с параметром sync
Разработчик опубликовал замеры для QEMU/KVM с виртуальным блочным устройством virtio-blk и параметром cache=none. Ниже приведено среднее время выполнения операции для 16 файлов с целевым размером 1 МиБ при синхронном монтировании.
| Операция | Размер кластера | До патча | После патча | Ускорение |
|---|---|---|---|---|
ftruncate() | 512 Б | 58,66 с | 0,362 с | 162,15× |
fallocate() | 512 Б | 61,36 с | 0,390 с | 157,15× |
ftruncate() | 4096 Б | 9,294 с | 0,111 с | 84,06× |
fallocate() | 4096 Б | 8,710 с | 0,110 с | 79,36× |
В сценариях без параметра sync ускорение составило от 1,13 до 1,79 раза. Автор измерял время изменения размера файла и резервирования места. Чтобы оценить эффект при обычном копировании на USB-накопитель, нужны отдельные замеры.
Откуда взялась цифра 265×
В более раннем патче тот же разработчик ускорил пакетное выделение кластеров для fallocate() с флагом FALLOC_FL_KEEP_SIZE. В том тесте резервировали по 16 МиБ для 16 файлов. Время сократилось с 92,489 до 0,348 секунды, то есть в 265,4 раза. У нового результата 162,15× другой сценарий: расширение файлов через ftruncate().
Патч вошёл в пакет изменений для 7.4-rc2. На 6 ноября последним опубликованным кандидатом на выпуск оставался Linux 7.4-rc1.