Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
Безопасность и правоРазбор · На радарModal Blog→ оригинал

Modal ускорил bun install в VM-песочницах в 12 раз, заменив virtio-fs на блочный диск

Modal запустила VM-песочницы и подключила к ним свою ленивую файловую систему ImageFS через virtio-fs. Холодный старт остался быстрым, но сама работа просела: chown на 100 000 вызовов шёл 9,87 с против 1,58 с на хосте, а bun install замедлился втрое. Причина — каждая операция с метаданными ходила через границу VM на хост. Решение: отдать госту собственную ext4 на блочном устройстве.

AI-обработка оригинала Modal Blog; редакция Hamidun News
Modal ускорил bun install в VM-песочницах в 12 раз, заменив virtio-fs на блочный диск
Источник: Modal Blog. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникModal Blog ↗
Главный редактор
Bun installс 12,5 до 1,07 с, то есть в 12 раз быстрее
Pgbench на записьс 8,3 до 18,8 тыс. TPS, SQLite — с 543 до 43 с
Минусхолодный ripgrep медленнее ImageFS — 8,5 против 4,5 с

Если вы строите песочницы для агентов, то знаете: быстрый старт ещё не значит быструю работу. Агент ставит зависимости, гоняет grep по репозиторию, меняет права на тысячи файлов. Всё это упирается в файловую систему. Инженеры Modal рассказали, как они на этом обожглись при запуске VM Sandboxes и что сделали.

Быстро стартует, медленно работает

У Modal давно есть ImageFS — распределённая файловая система с ленивой загрузкой для контейнеров. Она заранее подтягивает только индекс метаданных, а содержимое файлов достаёт по требованию из многоуровневого кэша: память, региональные CDN, глобальное хранилище. Поэтому контейнеры стартуют меньше чем за секунду. Для записи сверху лежит OverlayFS.

С виртуалками логика такая же: у VM свой гостевой kernel и прямого доступа к ImageFS на хосте нет. Стандартный мост — virtio-fs, где демон virtiofsd на хосте применяет запросы гостя к общей директории. Её направили на ImageFS, и старт остался прежним.

Но в работе всё посыпалось. Рекурсивный chown вместо четырёх секунд занял больше минуты. bun install и pnpm install замедлились примерно втрое, а ripgrep просел сильнее всего. На микробенчмарке из 100 000 вызовов chown занял 9,87 с против 2,31 с под gVisor и 1,58 с на голом ImageFS.

Почему один chown превращается в три поездки

Трассировка показала главное. Один chown в гостевом kernel раскладывается на три запроса к хосту: getxattr для проверки capabilities, getattr для setuid-битов и setattr для самой смены владельца. Демон делает шесть системных вызовов, и каждый из них попадает в ImageFS. Итого около 99 мкс на операцию, причём virtiofsd уже был настроен на максимальное кэширование.

Корень проблемы в архитектуре. virtio-fs — это общая файловая система: за метаданными каждый раз надо идти к авторитету по ту сторону границы VM. Хотя хосту содержимое корневой ФС виртуалки вообще не нужно.

Говорим блоками

Инженеры предложили оставить файловую систему целиком внутри гостя, а хосту дать только блочное устройство через virtio-blk. Диск не знает, что такое файл: он хранит и отдаёт куски данных. Гостевая ext4 сама проверяет права, чистит биты и пишет изменение в журнал. На хост всё уходит позже, пачкой, раз в несколько секунд. Один chown стоит около 2,1 мкс вместо 99.

Сложность в том, что mkfs.ext4 требует, чтобы весь образ был на месте, а это убивает ленивую загрузку. Поэтому команда сама записывает inode-записи ext4 по метаданным образа и оставляет остальное разреженным. Демон ImageFS-blk превращает блочные запросы в чтение диапазонов файлов из ImageFS, а записанные блоки кладёт в sparse-файл и помечает в битовой карте. Это аналог OverlayFS, только на уровне блоков. Заодно уходит старая боль: копирование при записи работает с одним блоком, а не со всем файлом. В худшем случае OverlayFS копировал гигабайты ради нескольких байт.

Что получилось и где подвох

Цифры такие (virtio-fs, ImageFS, ImageFS-blk):

  • bun install: 12,5 с, 3,1 с, 1,07 с;
  • ripgrep по репозиторию Linux на тёплом кэше: 6,03 с, 3,77 с, 0,18 с;
  • SQLite speedtest1: 543 с, 290 с, 43 с;
  • pgbench только чтение: 98 тыс., 137 тыс., 230 тыс. TPS;
  • pgbench чтение и запись: 8,3 тыс., 11,9 тыс., 18,8 тыс. TPS.

ImageFS-blk обогнал даже исходный ImageFS: метаданные больше не ходят через FUSE. Холодный старт в пределах секунды сохранился.

У подхода есть цена. Хост больше не видит файлы внутри VM: он знает только блоки, а снапшоты считаются по набору изменённых блоков. А на холодном кэше ripgrep по репозиторию у ImageFS-blk 8,53 с против 4,47 с у обычного ImageFS. Блочная схема там проигрывает. Все цифры получены самой Modal на её железе, независимой проверки нет.

Что с этим делать

Если вы строите микро-VM для агентов или CI, не принимайте virtio-fs как корневую ФС по умолчанию. Для одиночной песочницы, где хост не читает файлы гостя, общая ФС — лишний налог на каждую операцию с метаданными. Прогоните не только cold start, но и свой реальный сценарий: установку пакетов, поиск по коду, chown и базу данных. Именно там разница в 10 раз и обнаруживается.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: быстро стартует, медленно работает?

У Modal давно есть ImageFS — распределённая файловая система с ленивой загрузкой для контейнеров. Она заранее подтягивает только индекс метаданных, а содержимое файлов достаёт по требованию из многоуровневого кэша: память, региональные CDN, глобальное хранилище. Поэтому контейнеры стартуют меньше чем за секунду. Для записи сверху лежит OverlayFS. С виртуалками логика такая же: у VM свой гостевой kernel и прямого доступа к ImageFS на хосте нет.

Что известно по теме: почему один chown превращается в три поездки?

Трассировка показала главное. Один chown в гостевом kernel раскладывается на три запроса к хосту: getxattr для проверки capabilities, getattr для setuid-битов и setattr для самой смены владельца. Демон делает шесть системных вызовов, и каждый из них попадает в ImageFS. Итого около 99 мкс на операцию, причём virtiofsd уже был настроен на максимальное кэширование. Корень проблемы в архитектуре. virtio-fs — это общая файловая система: за метаданными каждый раз надо идти к авторитету по ту сторону границы VM.

Что известно по теме: говорим блоками?

Инженеры предложили оставить файловую систему целиком внутри гостя, а хосту дать только блочное устройство через virtio-blk. Диск не знает, что такое файл: он хранит и отдаёт куски данных. Гостевая ext4 сама проверяет права, чистит биты и пишет изменение в журнал. На хост всё уходит позже, пачкой, раз в несколько секунд. Один chown стоит около 2,1 мкс вместо 99. Сложность в том, что mkfs.ext4 требует, чтобы весь образ был на месте, а это убивает ленивую загрузку.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Единое AI-пространство · Nomad

Протестируйте новые LLM и мультимодальные модели в одном окне

Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.

Открыть Nomad AI →Автономный Nomad Agent
Что вы думаете?
Загружаем комментарии…