Появилась странная проблема с производительностью нашей системы журналирования. мы записываем множество небольших файлов журналов в один каталог на ext4 (ubuntu 20.04, ядро 5.4). каждый файл имеет размер 2-10 КБ.
сначала 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, не увидел большой глубины очереди
Появилась странная проблема с производительностью нашей системы журналирования. мы записываем множество небольших файлов журналов в один каталог на ext4 (ubuntu 20.04, ядро 5.4). каждый файл имеет размер 2-10 КБ. сначала fsync занимает ~ 1 мс, но после того, как в каталоге появляется около 50 тысяч файлов, fsync начинает занимать 100-200 мс! и становится все хуже. к тому времени, когда у нас есть 150 тыс. файлов, на каждую fsync требуется более 500 мс, что снижает нашу пропускную способность. детали настройки: [list] [*]файловая система ext4 с включенным dir_index (проверено с помощью Tune2fs) [*]файлы, названные последовательно, например log_000001.txt, log_000002.txt и т.д. [*]запись с флагом O_SYNC, вызов fsync() после каждой записи [*]каждый файл закрывается после записи [*]SSD-диск (samsung 970 evo), производительность диска в порядке (проверено с помощью fio) [/list] что мы уже пробовали: [list] [*]переключились с O_SYNC на обычную запись + fsync - та же проблема [*]пробовал fdatasync вместо fsync - возможно, на 10 % лучше, но все равно медленно [*]проверил использование индексного дескриптора, доступно много [*]пробовал dir_nlink, но не помогло [*]отслеживал с помощью iostat, не увидел большой глубины очереди [/list] пример кода (упрощенный): [code]int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); write(fd, data, len); fsync(fd); //