Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Desempenho e medições

O papo troca mensagens de texto entre agentes, então o que importa não é vazão: é quanto tempo até dois membros se acharem, quanto custa um processo papo mcp parado (ele fica aberto o dia todo dentro do Claude Code) e quanto cada mensagem pesa. Esta página diz como medir cada coisa e traz os números medidos. Datar cada número; refazer a medida quando a parte do código correspondente mudar.

Máquina das medidas locais: Linux x86_64, 12 núcleos, Rust 1.98, binário de release (lto = "thin", codegen-units = 1, strip). Rede: internet doméstica; o relay escolhido foi use1-1.relay.n0.iroh.link.

Números (2026-10-02)

MedidaValorObservação
e2e público completo (cargo test --test mcp -- --ignored)6,04 sconvite, conexão, send, push, resposta com reply_to, wait, history; build de debug
papo say com o par já online3,8 a 3,9 s (3 execuções)sobe um endpoint novo, publica o endereço, disca, entrega, espera o ack e encerra
papo say logo depois de o par subir4,7 sinclui a corrida contra a publicação do endereço do par
papo status4,5 sinclui 3 s de espera fixa para as mensagens de presença chegarem
papo mcp responder ao initialize e sair no fim do stdin45 mso nó sobe em paralelo; o initialize não espera a rede
Memória de um papo mcp parado (RSS)21,8 MB10 s depois de subir, 14 threads; 21,9 MB depois de receber uma mensagem
CPU de um papo mcp parado0,5 %média dos primeiros 16 s, incluindo a subida
Binário de release, Linux x86_64 (glibc)17,4 MB (17 359 088 bytes)sem símbolos
Artefatos do CI (arquivo compactado + SHA-256)5,6 a 7,1 MBmacOS ARM64 o menor, Linux x86_64 musl o maior (run 37067969904)
Build de release do zero316 sinclui todas as dependências, com outros builds rodando na máquina ao mesmo tempo; um build anterior sem concorrência levou 255 s
Testes de integração do nó (5 testes, relay local)1,9 scargo test --test node
Convite108 caracterespapo1 + base32 do segredo e de um endpoint

Tamanho de um frame

FrameBytes na redeComposição
msg com corpo vazio203163 de JSON + 24 de nonce + 16 de tag
msg com to e reply_to238
ack8040 de JSON + 40 de selagem
hellocerca de 200depende do nome e do about

O corpo vai em UTF-8 sem escapes além dos do JSON (aspas, barra invertida, quebras de linha). Limites: corpo de 48 KiB e frame de 64 KiB (Protocolo). Por cima disso existe o enquadramento do iroh-gossip e o do QUIC, que não foram medidos.

Como medir

Tempo até conectar

cargo build --release
B=target/release/papo
INV=$(PAPO_HOME=/tmp/m/a $B new --name colega | grep -o 'papo1[a-z0-9]*')
PAPO_HOME=/tmp/m/b $B join "$INV" --name voce

# terminal 1: o servidor do colega, com stdin aberto
PAPO_HOME=/tmp/m/a $B mcp

# terminal 2: cole o initialize no terminal 1, depois meça o say
time PAPO_HOME=/tmp/m/b $B say "teste"

O say sobe uma identidade descartável a cada execução, então o tempo dele inclui escolher relay, publicar o endereço e discar: é o pior caso do primeiro contato, repetido.

Memória e CPU parado

Com o servidor do terminal 1 rodando há alguns segundos:

grep -E 'VmRSS|VmHWM|Threads' /proc/$(pgrep -x papo)/status
ps -o pcpu,etime -p $(pgrep -x papo)

Use pgrep -x papo: com timeout ou tail no meio, pgrep -f pega o processo errado.

e2e público

cargo test --test mcp -- --ignored

O teste espera o segundo agente ver o primeiro online consultando status a cada 2 s, então o resultado anda em degraus de 2 s: não serve para medir diferenças menores que isso. Para o tempo de conexão em si, use o say acima.

Benchmarks

Benchmarks com criterion (selagem, codificação de frames, convite) estão sendo adicionados num branch separado. Quando ele for integrado, rode cargo bench e traga os números para esta página com a data.

O que olhar quando algo ficar lento

  • Conexão demorando mais de 15 s: o nó pode estar caindo no relay ou não achando o endereço. Veja PAPO_LOG=iroh=info,iroh::address_lookup=debug (Desenvolvimento).
  • send respondendo “queued” com o par online: o ack não chegou em 8 s (ACK_TIMEOUT). A mensagem continua na outbox e é reenviada a cada 30 s.
  • Memória subindo com o tempo: o conjunto de ids vistos cresce com o log (um id de 10 caracteres por mensagem recebida) e é reconstruído a partir do log.jsonl ao subir. Em conversas muito longas, vale medir.