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
Если вы строите песочницы для агентов, то знаете: быстрый старт ещё не значит быструю работу. Агент ставит зависимости, гоняет 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 раз и обнаруживается.
- 12 нояб. 2026 г.NVIDIA Vera вдвое ускорила Modal Sandboxes: на 150 контейнерах — до 4 281 задачи в минуту
- 12 нояб. 2026 г.Snorkel гоняет миллионы агентных симуляций в месяц и экономит 20% на песочницах
- 12 нояб. 2026 г.Legora гоняет 2000 параллельных прогонов юридического агента в песочницах Modal
- 13 окт. 2026 г.Bloom Security нашла уязвимость в публикации пакетов, а ИИ-агенты множат риск
Вопросы и ответы по материалу
Что известно по теме: быстро стартует, медленно работает?
У 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 требует, чтобы весь образ был на месте, а это убивает ленивую загрузку.
Протестируйте новые LLM и мультимодальные модели в одном окне
Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.
Главное из мира ИИ — раз в неделю
7 ключевых событий недели, отобранных вручную. Без шума, репостов и пресс-релизов.
Готово! Проверьте почту — мы отправили подтверждение.