
Я создаю слой-прокладку над файловой системой в памяти (tmpfs), чтобы иметь возможность перехватывать команды файловой системы и выполнять дополнительную обработку (конечная цель — реплицировать записи по сети для обеспечения отказоустойчивости). Для перехвата команд файловой системы я использую FUSE. Для файловой системы в памяти я использую tmpfs. Чтобы преодолеть небольшой размер памяти, я создал достаточно места подкачки на SSD для использования tmpfs.
Подводя итог, у меня есть каталог dir
, который смонтирован с помощью tmpfs. Я создал другой каталог shim
, в который все приложения записывают. FUSE смонтирован shim
и перенаправляет все операции в dir
.
С помощью микробенчмаркинга с Filebench, напрямую записывающим в dir
, я обнаружил, что tmpfs + swap имеет очень низкую задержку, особенно по сравнению с ext4 на диске. Не наблюдается ощутимого замедления, когда tmpfs переключается с записи в ОЗУ на запись в пространство подкачки, я предполагаю, что это из-за некоторых умных упреждающих чтений.
Когда я накладываю его с помощью FUSE сpassthrough_hp.c, однако, даже при включенной многопоточности создание файла становится очень медленным, задержка примерно в 60 раз выше, чем у tmpfs + swap. Используя htop
, я заметил, что он замедляется только тогда, когда пишет в swap вместо памяти (память заполняется очень быстро, а затем swap медленно увеличивается). В противном случае сам FUSE имеет довольно мало накладных расходов.
Кто-нибудь знает, почему FUSE увеличивает задержку при использовании swap, а tmpfs — нет, и как бы я мог оптимизировать работу, чтобы избежать этих дополнительных накладных расходов?