Высокая задержка при использовании FUSE для передачи в tmpfs + swap

Высокая задержка при использовании FUSE для передачи в tmpfs + swap

Я создаю слой-прокладку над файловой системой в памяти (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 — нет, и как бы я мог оптимизировать работу, чтобы избежать этих дополнительных накладных расходов?

Связанный контент