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:*
-
**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* (initdo GenServer). O Rustler aloca a estrutura C++ e retorna ao Gleam apenas um ponteiro protegido (ModelResourceopaco) protegido por umMutex[cite: 53, 54]. O Garbage Collector da BEAM sabe quando descarregar o recurso chamando a trait Drop no Rust. -
**Delegação para
Dirty Schedulers:** Todas as chamadas para a funçãogenerate_textna 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.