Gerenciamento de Processos e Recursos
Depure serviços Rust em execução com ps, htop, sinais e perf. Valide o desligamento gracioso, contagem de threads e crescimento de memória sob carga.
Receita
pgrep -a my-service
kill -TERM "$(pgrep my-service)"
sleep 2
pgrep my-service || echo "exited cleanly"
htop -p "$(pgrep -d',' my-service)"Quando usar isso:
- O serviço não para na implantação
- CPU no máximo após pico de tráfego
- Investigando suspeitas de vazamento de memória
Exemplo de Trabalho
# Monitora arquivos abertos para vazamento de conexão
PID=$(pgrep my-service)
ls -l /proc/$PID/fd | wc -l
# Amostra de stack com perf (Linux)
sudo perf record -g -p $PID -- sleep 30
sudo perf report
# Resumo do mapa de memória
pmap -x $PID | tail -1// Garante que SIGTERM seja tratado no serviço
use tokio::signal;
async fn shutdown_signal() {
signal::ctrl_c().await.ok();
signal::unix::signal(signal::unix::SignalKind::terminate())
.unwrap()
.recv()
.await
.ok();
}O que isso demonstra:
- TERM antes de KILL corresponde à terminação de pod do Kubernetes
/proc/$PID/fdconta sockets/arquivos abertosperfatribui CPU a símbolos (com símbolos de depuração)
Aprofundamento
Sinais
| Sinal | Uso |
|---|---|
| SIGTERM (15) | Solicitação de desligamento gracioso |
| SIGINT (2) | Ctrl-C no desenvolvimento local |
| SIGKILL (9) | Forçar encerramento, sem limpeza |
| SIGHUP (1) | Recarregar configuração (se implementado) |
Threads do Runtime Tokio
O runtime multithread padrão usa ~N threads de trabalho; o pool de bloqueio adiciona mais sob carga de spawn_blocking.
Armadilhas
- SIGKILL em testes - esconde bugs de desligamento. Correção: teste de integração do caminho SIGTERM.
- perf sem permissões -
perf_event_paranoid. Correção: ajuste sysctl ousudo. - Símbolos de depuração removidos - pilhas perf inúteis. Correção: reter símbolos em builds de staging.
- Ler apenas RSS - o alocador armazena memória em cache. Correção: monitorar ao longo do tempo e padrões de carga.
- PID errado após recarregar - reinícios do systemd. Correção:
systemctl statuspara o PID atual.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
tokio-console | Introspecção de tarefas assíncronas | Sempre ativo em produção |
heaptrack / dhat | Profiling do alocador | Verificação rápida de CPU |
bpftrace | Rastreamento em nível de kernel | Desenvolvimento local simples |
FAQs
Quantas threads é normal?
Threads de trabalho do Tokio mais algumas threads de bloqueio; investigue centenas.
perf no macOS?
Use samply ou Instruments em vez de perf do Linux.
Limite de FD no Docker?
Defina ulimits no contexto de segurança do compose ou K8s para serviços Axum com muitas conexões.
Relacionados
Versões de Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.