Ao vivo 18/11 · Turma 318 nov às 19:00 MSK — aula prática gratuita de agentes de IA · Turma 3 ao vivo começa 23/11Aula 18/11 →Turma 3 (23/11)
LançamentoAnálise · No radarModal Blog→ original

Modal acelerou o bun install em sandboxes de VM em 12 vezes ao trocar o virtio-fs por um disco de blocos

A Modal lançou sandboxes em VM e conectou a elas o seu sistema de arquivos preguiçoso ImageFS via virtio-fs. A partida a frio continuou rápida, mas o trabalho em si degradou: 100 000 chamadas de chown levaram 9,87 s, contra 1,58 s no host, e o bun install ficou três vezes mais lento. A causa: cada operação de metadados atravessava a fronteira da VM até o host. A solução foi entregar ao convidado uma ext4 própria em um dispositivo de blocos.

Processado por IA de Modal Blog; editado por Hamidun News
Modal acelerou o bun install em sandboxes de VM em 12 vezes ao trocar o virtio-fs por um disco de blocos
Fonte: Modal Blog. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalModal Blog ↗
Editor-chefe
Bun installde 12,5 para 1,07 s, ou seja, 12 vezes mais rápido
Pgbench de escritade 8,3 para 18,8 mil TPS; SQLite: de 543 para 43 s
Contrao ripgrep a frio é mais lento que no ImageFS: 8,5 contra 4,5 s

Se você constrói sandboxes para agentes, sabe: partida rápida não significa trabalho rápido. O agente instala dependências, roda grep no repositório, altera permissões de milhares de arquivos. Tudo isso esbarra no sistema de arquivos. Os engenheiros da Modal contaram como se queimaram com isso ao lançar as VM Sandboxes e o que fizeram a respeito.

Inicia rápido, trabalha devagar

A Modal tem há tempos o ImageFS, um sistema de arquivos distribuído com carregamento preguiçoso para contêineres. Ele puxa antecipadamente apenas o índice de metadados, e o conteúdo dos arquivos é buscado sob demanda em um cache de vários níveis: memória, CDNs regionais e armazenamento global. Por isso os contêineres iniciam em menos de um segundo. Para escrita, há uma camada OverlayFS por cima.

Com as máquinas virtuais, a lógica é a mesma: a VM tem seu próprio kernel convidado e não há acesso direto ao ImageFS no host. A ponte padrão é o virtio-fs, no qual o daemon virtiofsd no host aplica as requisições do convidado a um diretório compartilhado. Ele foi apontado para o ImageFS, e a partida continuou igual.

Mas, no trabalho, tudo desandou. Um chown recursivo, em vez de quatro segundos, levou mais de um minuto. bun install e pnpm install ficaram cerca de três vezes mais lentos, e o ripgrep foi o que mais caiu. Em um microbenchmark de 100 000 chamadas, o chown levou 9,87 s, contra 2,31 s no gVisor e 1,58 s no ImageFS puro.

Por que um chown vira três viagens

O rastreamento mostrou o essencial. Um chown no kernel convidado se desdobra em três requisições ao host: getxattr para verificar capabilities, getattr para os bits setuid e setattr para a troca do proprietário em si. O daemon faz seis chamadas de sistema, e cada uma delas chega ao ImageFS. Total: cerca de 99 µs por operação, e isso com o virtiofsd já configurado para o cache máximo.

A raiz do problema está na arquitetura. O virtio-fs é um sistema de arquivos compartilhado: para os metadados, é preciso sempre consultar a autoridade do outro lado da fronteira da VM. Embora o host não precise do conteúdo do sistema de arquivos raiz da máquina virtual.

Falando em blocos

Os engenheiros propuseram manter o sistema de arquivos inteiramente dentro do convidado e dar ao host apenas um dispositivo de blocos via virtio-blk. O disco não sabe o que é um arquivo: ele guarda e entrega pedaços de dados. A ext4 do convidado verifica as permissões, limpa bits e registra a alteração no journal por conta própria. Para o host, tudo vai depois, em lote, a cada poucos segundos. Um chown custa cerca de 2,1 µs em vez de 99.

A dificuldade é que o mkfs.ext4 exige que a imagem inteira esteja presente, o que mata o carregamento preguiçoso. Por isso a equipe escreve por conta própria os registros de inode da ext4 a partir dos metadados da imagem e deixa o restante esparso. O daemon ImageFS-blk converte requisições de blocos em leituras de intervalos de arquivos do ImageFS, e os blocos escritos vão para um arquivo esparso e são marcados em um mapa de bits. É um análogo do OverlayFS, só que no nível de blocos. De quebra, desaparece uma dor antiga: a cópia na escrita opera com um bloco, e não com o arquivo inteiro. No pior caso, o OverlayFS copiava gigabytes por causa de alguns bytes.

O resultado e a pegadinha

Os números são estes (virtio-fs, ImageFS, ImageFS-blk):

  • bun install: 12,5 s, 3,1 s, 1,07 s;
  • ripgrep no repositório do Linux com cache quente: 6,03 s, 3,77 s, 0,18 s;
  • SQLite speedtest1: 543 s, 290 s, 43 s;
  • pgbench somente leitura: 98 mil, 137 mil, 230 mil TPS;
  • pgbench leitura e escrita: 8,3 mil, 11,9 mil, 18,8 mil TPS.

O ImageFS-blk superou até o ImageFS original: os metadados deixaram de passar pelo FUSE. A partida a frio em até um segundo foi mantida.

A abordagem tem um preço. O host deixa de ver os arquivos dentro da VM: ele conhece apenas blocos, e os snapshots são calculados pelo conjunto de blocos alterados. Além disso, com cache frio, o ripgrep no repositório leva 8,53 s no ImageFS-blk contra 4,47 s no ImageFS comum. Nesse caso, o esquema em blocos perde. Todos os números foram obtidos pela própria Modal em seu hardware, sem verificação independente.

O que fazer com isso

Se você constrói micro-VMs para agentes ou CI, não aceite o virtio-fs como sistema de arquivos raiz por padrão. Para uma sandbox isolada, em que o host não lê os arquivos do convidado, um sistema de arquivos compartilhado é um imposto desnecessário sobre cada operação de metadados. Teste não só o cold start, mas também o seu cenário real: instalação de pacotes, busca no código, chown e banco de dados. É justamente aí que aparece a diferença de 10 vezes.

História

Perguntas frequentes sobre a notícia

O que se sabe sobre Inicia rápido, trabalha devagar?

A Modal tem há tempos o ImageFS, um sistema de arquivos distribuído com carregamento preguiçoso para contêineres. Ele puxa antecipadamente apenas o índice de metadados, e o conteúdo dos arquivos é buscado sob demanda em um cache de vários níveis: memória, CDNs regionais e armazenamento global. Por isso os contêineres iniciam em menos de um segundo. Para escrita, há uma camada OverlayFS por cima.

Por que um chown vira três viagens?

O rastreamento mostrou o essencial. Um chown no kernel convidado se desdobra em três requisições ao host: getxattr para verificar capabilities, getattr para os bits setuid e setattr para a troca do proprietário em si. O daemon faz seis chamadas de sistema, e cada uma delas chega ao ImageFS. Total: cerca de 99 µs por operação, e isso com o virtiofsd já configurado para o cache máximo. A raiz do problema está na arquitetura.

O que se sabe sobre Falando em blocos?

Os engenheiros propuseram manter o sistema de arquivos inteiramente dentro do convidado e dar ao host apenas um dispositivo de blocos via virtio-blk. O disco não sabe o que é um arquivo: ele guarda e entrega pedaços de dados. A ext4 do convidado verifica as permissões, limpa bits e registra a alteração no journal por conta própria. Para o host, tudo vai depois, em lote, a cada poucos segundos. Um chown custa cerca de 2,1 µs em vez de 99.

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
O que você acha?
Carregando comentários…