сначала fsync занимает ~ 1 мс, но после того, как в каталоге появляется около 50 тысяч файлов, fsync начинает занимать 100-200 мс! и становится все хуже. к тому времени, когда у нас есть 150 тыс. файлов, на каждую fsync требуется более 500 мс, что снижает нашу пропускную способность.
детали настройки:
- файловая система ext4 с включенным dir_index (проверено с помощью Tune2fs)
- файлы, названные последовательно, например log_000001.txt, log_000002.txt и т.д.
- запись с флагом O_SYNC, вызов fsync() после каждой записи
- каждый файл закрывается после записи
- SSD-диск (samsung 970 evo), производительность диска в порядке (проверено с помощью fio)
- переключились с O_SYNC на обычную запись + fsync - та же проблема
- пробовал fdatasync вместо fsync - возможно, на 10 % лучше, но все равно медленно
- проверил использование индексного дескриптора, доступно много
- пробовал dir_nlink, но не помогло
- отслеживал с помощью iostat, не увидел большой глубины очереди
Код: Выделить всё
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
write(fd, data, len);
fsync(fd); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79860501/ext4-fsync-gets-slower-and-slower-as-directory-fills-up-is-there-a-limit-or-so[/url]