- Sandbox de processo único baseado em KVM
- Pode executar programas Linux comuns ou programas que usam APIs específicas dentro do sandbox
- Fornece desempenho nativo usando virtualização de hardware
- Usa apenas uma parte da API do KVM → base de código pequena e eficiente
Arquitetura do TinyKVM
- Suporte à execução de programas Linux ELF estáticos
- Suporte a executáveis dinâmicos será adicionado futuramente
- Também pode ser estendido com APIs para fornecer acesso a servidores HTTP externos ou caches
- Atualmente funciona em AMD64(x86_64), com plano de port para AArch64(ARM de 64 bits)
- Suporte a hugepages
- É possível criar hugepages para páginas do guest
- O host também pode usar hugepages → melhora de desempenho
- Ex.: ao alocar páginas de 2 MB, foi observado um aumento de 5% no desempenho de compilação com LLVM
- Chamadas de função rápidas
- Ao chamar funções no guest, o overhead é de 2μs
- Ao executar sem timer, o overhead cai para 1,2μs
- Suporte a depuração remota
- É possível depurar remotamente com GDB
- Após a depuração, o programa pode ser retomado normalmente
- Suporte a Copy-on-Write
- Suporta seu próprio mecanismo de fork → minimiza a duplicação de memória
- Ex.: ao duplicar um modelo de 6 GB, cada instância precisa de apenas 260 MB de memória
- Inicialização rápida de estado
- O estado do guest pode ser resetado rapidamente → reforça a segurança
- Resetar a cada requisição reduz o risco de exposição de estado
- Base de código simplificada
- Usa cerca de 42k LOC da API do KVM
- A base de código do próprio TinyKVM tem cerca de 9k LOC → muito menor que soluções concorrentes
- Ex.: Wasmtime 350k LOC, FireCracker 165k LOC
- Criação estática de tabelas de página
- Não é possível modificar as tabelas de página em tempo de execução → reforça a segurança
- Verificações de integridade das tabelas de página são realizadas
- Contexto de processo isolado
- O guest KVM usa PCID/ASID separado → mais resistente a ataques de execução especulativa como Spectre
- Kernel com segurança reforçada
- SMEP e SMAP ativados
- Exceções de CPU podem ser tratadas em modo de usuário
Tratamento de system calls
- Conexão de API com o host
- As system calls são executadas via instruções SYSCALL/SYSRET ou OUT
- Ao executar uma system call, ocorre um VM exit → leva cerca de 1μs
- Recomenda-se reduzir chamadas pequenas e projetar APIs com unidades maiores de entrada e saída
Benchmark
- Overhead de chamadas da VM
- A tail latency é medida ao resetar a VM
- Em chamadas simples sem reset, o overhead é baixo
- Desempenho de memória
- O desempenho de memória está em nível normal
- Ex.: em benchmark HTTP, é possível codificar 1500 imagens AVIF por segundo
- Desempenho de conversão JPEG → AVIF
- É possível converter cerca de 1582 imagens por segundo
- Conversão sem perdas é possível usando o caminho de conversão YUV
Por que o sandbox é tão rápido
- Sem uso de I/O e drivers
- Não há I/O, drivers nem dispositivos virtuais → evita perda de desempenho
- Usa apenas recursos de CPU → aproxima-se da velocidade nativa
- Otimização com hugepages
- O uso de hugepages reduz page walks → melhora o desempenho
- Em grandes workloads de LLM, atinge 99,7% do desempenho nativo
- Chamadas rápidas de VM
- Overhead mínimo ao chamar funções no guest
- Os dados podem ser processados na velocidade nativa da CPU
Limitações
- Não é possível reduzir o número de vCPUs
- A API do KVM não permite reduzir o número de vCPUs
- O multiprocessamento pode ser resolvido executando várias VMs em paralelo
- Problema de queda de desempenho no reset
- Pode haver degradação de desempenho ao resetar o estado da VM
- Mas isso pode ser resolvido por meio de compartilhamento e replicação de estado
Próximos passos
- Adicionar suporte a Intel TDX e AMD SEV
- Port para AArch64
- Adicionar recurso de bloqueio de memória (
KVM_MEM_READONLY) → reforço de segurança
- Melhorar a API para ser mais amigável ao usuário
- Adicionar suporte ao carregamento de links dinâmicos → reforçar a integração com o Varnish
Conclusão
- TinyKVM é uma das menores e mais rápidas soluções de sandbox
- Alcança tanto reforço de segurança quanto otimização de desempenho
- A base de código é pequena, o que facilita a manutenção
- Disponível como biblioteca open source → se tiver interesse, vale conferir o repositório de código
Repositório do TinyKVM
2 comentários
Interessante e diferente.
Comentários no Hacker News
Gostei muito disso. Espero que continuem sem parar o trabalho que estão fazendo agora
É parecido com o Firecracker, mas muito mais rápido
Post original: link
Muito interessante. O desempenho de restauração de snapshot em 2.5us é comparável ao Wasmtime, mas com a grande vantagem de poder executar código nativo. Em compensação, é bem mais lento, embora ainda mantenha interoperabilidade na escala de microssegundos
Basicamente não é algo como o libkrun? link
Não é exatamente o caso de uso pretendido, mas alguém já teve experiência rodando um servidor X (ou Wayland)?
É interessante, mas estou tendo dificuldade para entender o panorama geral. Isso executa um processo de usuário em uma VM sem kernel? Todas as system calls fazem a VM encerrar e são então encaminhadas por proxy para o host? Ou não há system calls?
Se servir para o seu caso de uso, isso é realmente muito legal
Muito legal
O artigo não diz que ele roda sobre o Varnish e, na verdade, o autor diz que isso não é para rodar o Varnish