Найти в Дзене
Векториум

Файловые системы в оперативной памяти на Rust: Великая иллюзия оптимизации

Представьте: вы часами боретесь с кодом, пытаясь выжать из него лишние миллисекунды. Вы знаете — две вещи замедляют ваши тесты: exec и fstat. Системные вызовы, которые веками были проклятием разработчиков. И вот решение! Элегантное, красивое — файловая система в оперативной памяти. Мечта, которая должна ускорить всё в разы. Но что, если я скажу вам, что всё это — великая иллюзия? Что ваши усилия напрасны? Что современные технологии свели на нет преимущества, за которые мы так цепляемся? Мой путь начался с простой цели — ускорить тесты. Коллега упомянул Afero для Go — библиотеку, которая позволяет подменять файловые системы. "Вот оно!" — подумал я. Rust должен иметь нечто подобное. Но поиски привели к неожиданному результату. Вместо готовых решений — лишь скептицизм сообщества. "В Rust это не нужно", — говорили мне. Но разве может быть ненужным то, что экономит время? Или мы стали заложниками догм? vfs казался идеальным решением. Поддержка разных бэкендов: память, реальная файловая сист
Оглавление

Представьте: вы часами боретесь с кодом, пытаясь выжать из него лишние миллисекунды. Вы знаете — две вещи замедляют ваши тесты: exec и fstat. Системные вызовы, которые веками были проклятием разработчиков. И вот решение! Элегантное, красивое — файловая система в оперативной памяти. Мечта, которая должна ускорить всё в разы.

Но что, если я скажу вам, что всё это — великая иллюзия? Что ваши усилия напрасны? Что современные технологии свели на нет преимущества, за которые мы так цепляемся?

В поисках святого Грааля: Rust и забытые уроки Go

Мой путь начался с простой цели — ускорить тесты. Коллега упомянул Afero для Go — библиотеку, которая позволяет подменять файловые системы. "Вот оно!" — подумал я. Rust должен иметь нечто подобное. Но поиски привели к неожиданному результату.

Вместо готовых решений — лишь скептицизм сообщества. "В Rust это не нужно", — говорили мне. Но разве может быть ненужным то, что экономит время? Или мы стали заложниками догм?

vfs и rsfs: два мира, одно разочарование

vfs казался идеальным решением. Поддержка разных бэкендов: память, реальная файловая система, даже файлы внутри бинарника. Но дьявол, как всегда, в деталях. Нет поддержки симлинков. Нет концепции прав доступа. Как создать исполняемый файл в такой системе? Оказалось — никак.

Тогда rsfs — более старый, но заточенный под совместимость с std::fs. Но здесь другая беда — типы. Каждая функция теперь должна быть параметризована типом файловой системы. Сигнатуры разрастаются, код усложняется. Цена за потенциальное ускорение оказалась слишком высокой.

Но я persisted. Переписал код, запустил тесты. И вот он — момент истины.

Странности тестирования: когда 45 мс равно 45 мс

Первые результаты обнадеживали: vfs — 850 мс, std::fs — 1200 мс. Казалось бы, победа! Но дальнейшие испытания открыли шокирующую правду.

vfs в памяти: 45 мс
rsfs в памяти: 45 мс
rsfs с реальной ФС: 45 мс
std::fs на SSD: 45 мс
std::fs на виртуальном диске: 45 мс

Цифры не лгут. Все подходы — одинаковы. Но как? Почему системные вызовы, которые должны быть медленными, вдруг сравнялись с вызовами в памяти?

Кэши, SSD и новая реальность

Ответ оказался одновременно простым и сложным. Современные SSD и продвинутые кэши файловых систем свели на нет преимущества in-memory решений. Операционные системы стали слишком умными. Они предугадывают наши действия, кэшируют всё, что можно, и делают системные вызовы практически бесплатными.

Мы всё еще мыслим категориями прошлого, когда обращение к диску было дорогим. Но мир изменился. SSD — это не старые HDD. Современные кэши — не примитивные буферы прошлого.

Риторический вопрос: а нужно ли это вообще?

Стоила ли овчинка выделки? Тратить время на поиски оптимизации, которая оказалась фантомом? Возможно, в каких-то специфических случаях in-memory ФС еще актуальны. Но для большинства повседневных задач — нет.

Может быть, вместо того чтобы бороться с системными вызовами, стоит принять их? В конце концов, они — часть системы, отлаженной десятилетиями разработки.

Вывод: есть мусор, будь свободен

Ирония судьбы: пытаясь оптимизировать, мы часто создаем себе больше проблем. Усложняем код, вводим ненужные абстракции, боремся с ветряными мельницами.

Иногда лучшее решение — самое простое. Тестируйте напрямую с файловой системой. Не усложняйте. Современное железо и ОС справятся сами.

Как говорится: "Ешь мусор, будь свободен". Может быть, в разработке стоит руководствоваться тем же принципом?