Gleam.br Wiki

GBR: ADR-0009 Gestão de Memória NIF e Isolamento de Scheduler (`DirtyCpu`) | Wiki

Documentação de engenharia e especificações técnicas da Gleam-BR.

GBR: ADR-0009 Gestão de Memória NIF e Isolamento de Scheduler (DirtyCpu)

  • *Status:* Aceito
  • *Data:* 2026-05-01

*Contexto:*

A inferência em Redes Neurais (Cálculo Matricial / Forward Pass) é uma operação CPU-Bound. Se o NIF em C++ mantivesse o controle do fluxo na Máquina Virtual Erlang durante o processo de geração de texto (que pode durar múltiplos segundos), o Scheduler principal ficaria bloqueado. Esse congelamento faria com que o tráfego de multiplexação (Yamux) e os temporizadores do Chronos entrassem em colapso por inanição (Starvation). Adicionalmente, carregar um modelo GGUF do disco a cada requisição de inferência destruiria a performance do sistema por exaustão de I/O.

*Decisão:*

  1. **Cache de Modelo via ResourceArc:** A FFI no Rust foi arquitetada para carregar os tensores do modelo em RAM *exclusivamente no boot do Ator Oráculo* (init do GenServer). O Rustler aloca a estrutura C++ e retorna ao Gleam apenas um ponteiro protegido (ModelResource opaco) protegido por um Mutex[cite: 53, 54]. O Garbage Collector da BEAM sabe quando descarregar o recurso chamando a trait Drop no Rust.
  2. **Delegação para Dirty Schedulers:** Todas as chamadas para a função generate_text na ponte Rust foram estritamente anotadas com #[rustler::nif(schedule = "DirtyCpu")][cite: 53].

*Consequências:*

  • *Positivas:* O carregamento do modelo amortiza o custo de I/O a quase zero para requisições subsequentes. As chamadas de inferência são atiradas para threads dedicadas do Sistema Operacional pelo Erlang, garantindo que o servidor Web (Wisp) e o Host P2P permaneçam 100% reativos mesmo sob estresse inferencial máximo.
  • *Negativas/Riscos:* O acoplamento da API C aos Dirty Schedulers delega a alocação do buffer de inferência para fora do controle do Micro-GC da Erlang. Qualquer vazamento de memória (Memory Leak) no código C++ passará despercebido pela BEAM até o OOM (Out of Memory) global do hospedeiro.