Pprof Analyzer
Analise perfis de desempenho pprof do Go (CPU, heap, goroutine, etc.) e gere flamegraphs.
Documentação
简体中文 | English
Pprof Analyzer MCP Server
Este é um servidor Model Context Protocol (MCP) implementado em Go, fornecendo uma ferramenta para analisar perfis de desempenho pprof do Go. Construído com o Model Context Protocol Go SDK oficial.
Recursos
- Ferramenta
analyze_pprof:- Analisa o arquivo pprof do Go especificado e retorna resultados de análise serializados (por exemplo, lista Top N ou JSON de flame graph).
- Tipos de Perfil Suportados:
cpu: Analisa o consumo de tempo de CPU durante a execução do código para encontrar pontos críticos.heap: Analisa o uso atual de memória (alocações de heap) para encontrar objetos e funções com alto consumo de memória. Aprimorado com contagem de objetos, local de alocação e informações de tipo.goroutine: Exibe stack traces de todas as goroutines atuais, usado para diagnosticar deadlocks, vazamentos ou uso excessivo de goroutines.allocs: Analisa alocações de memória (incluindo as liberadas) durante a execução do programa para localizar código com alocações frequentes. Fornece informações detalhadas sobre o local de alocação e contagem de objetos.mutex: Analisa contenção em mutexes para encontrar locks que causam bloqueio. Fornece estatísticas detalhadas incluindo contagens de contenção, tempos de atraso e porcentagens.block: Analisa operações que causam bloqueio de goroutines (por exemplo, esperas em canais, chamadas de sistema). Fornece estatísticas abrangentes de bloqueio com cálculos de atraso médio.
- Formatos de Saída Suportados:
text,markdown,json(lista Top N),flamegraph-json(dados hierárquicos de flame graph, padrão).text,markdown: Texto legível ou formato Markdown.json: Gera resultados Top N em formato JSON estruturado (implementado paracpu,heap,goroutine,allocs,mutex,block).flamegraph-json: Gera dados hierárquicos de flame graph em formato JSON, compatível com d3-flame-graph (implementado paracpu,heap,allocs, formato padrão). A saída é compacta.
- Número configurável de resultados Top N (
top_n, padrão 5, efetivo para os formatostext,markdown,json).
- Ferramenta
generate_flamegraph:- Usa
go tool pprofpara gerar um flame graph (formato SVG) para o arquivo pprof especificado, salva-o no caminho especificado e retorna o caminho e o conteúdo SVG. - Tipos de Perfil Suportados:
cpu,heap,allocs,goroutine,mutex,block. - Requer que o usuário especifique o caminho do arquivo SVG de saída.
- Importante: Este recurso depende do Graphviz estar instalado.
- Usa
- Ferramenta
open_interactive_pprof(somente macOS):- Tenta iniciar a interface web interativa do
go tool pprofem segundo plano para o arquivo pprof especificado. Usa a porta:8081por padrão sehttp_addressnão for fornecida. - Retorna o ID do Processo (PID) do processo
pprofem segundo plano após a inicialização bem-sucedida. - Somente macOS: Esta ferramenta funcionará apenas no macOS.
- Dependências: Requer que o comando
goesteja disponível no PATH do sistema. - Limitações: Erros do processo
pprofem segundo plano não são capturados pelo servidor. Arquivos temporários baixados de URLs remotas não são limpos automaticamente até que o processo seja encerrado (manualmente viadisconnect_pprof_sessionou quando o servidor MCP sair).
- Tenta iniciar a interface web interativa do
- Ferramenta
detect_memory_leaks:- Compara dois snapshots de perfil de heap para identificar possíveis vazamentos de memória.
- Analisa o crescimento de memória por tipo de objeto e local de alocação.
- Fornece estatísticas detalhadas sobre o crescimento de memória, incluindo mudanças absolutas e percentuais.
- Limite de crescimento e limite de resultados configuráveis.
- Ajuda a identificar vazamentos de memória comparando perfis obtidos em diferentes momentos.
- Ferramenta
disconnect_pprof_session:- Tenta encerrar um processo
pprofem segundo plano iniciado anteriormente poropen_interactive_pprof, usando seu PID. - Envia um sinal de Interrupção primeiro e, em seguida, um sinal Kill se a Interrupção falhar.
- Tenta encerrar um processo
- Ferramenta
compare_profiles:- Compara dois arquivos de perfil (por exemplo, baseline vs. alvo) para identificar regressões ou melhorias de desempenho.
- Suporta todos os tipos de perfil (cpu, heap, allocs, mutex, block).
- Fornece estatísticas detalhadas de diff incluindo funções melhoradas/regredidas, funções adicionadas/removidas.
- Indicadores visuais: 🔴 regressão, 🟢 melhoria, 🆕 adicionado, ❌ removido.
- Suporta formatos de saída texto, markdown e JSON.
- Ferramenta
analyze_heap_time_series:- Analisa múltiplos perfis de heap ao longo do tempo para identificar tendências de crescimento de memória e possíveis vazamentos.
- Requer pelo menos 3 perfis de heap fornecidos em ordem cronológica.
- Calcula taxas de crescimento (bytes, porcentagem, MB por minuto).
- Identifica tipos de objetos em tendência com indicadores direcionais (📈 aumentando, 📉 diminuindo, ➡️ estável).
- Suporta rótulos personalizados para cada ponto no tempo ou gera automaticamente rótulos padrão.
- Suporta formatos de saída texto, markdown e JSON.
Instalação (Como Biblioteca/Ferramenta)
Você pode instalar este pacote diretamente usando go install:
go install github.com/ZephyrDeng/pprof-analyzer-mcp@latest
Isso instalará o executável pprof-analyzer-mcp no diretório $GOPATH/bin ou $HOME/go/bin. Certifique-se de que este diretório esteja no PATH do seu sistema para executar o comando diretamente.
Compilando a partir do Código Fonte
Certifique-se de ter um ambiente Go instalado (Go 1.18 ou superior recomendado).
No diretório raiz do projeto (pprof-analyzer-mcp), execute:
go build
Isso gerará um arquivo executável chamado pprof-analyzer-mcp (ou pprof-analyzer-mcp.exe no Windows) no diretório atual.
Usando go install (Recomendado)
Você também pode usar go install para instalar o executável no diretório $GOPATH/bin ou $HOME/go/bin. Isso permite executar pprof-analyzer-mcp diretamente da linha de comando (se o diretório for adicionado à variável de ambiente PATH do seu sistema).
# Installs the executable using the module path defined in go.mod
go install .
# Or directly using the GitHub path (recommended after publishing)
# go install github.com/ZephyrDeng/pprof-analyzer-mcp@latest
Executando com Docker
Usar Docker é uma maneira conveniente de executar o servidor, pois ele inclui a dependência necessária do Graphviz.
-
Construir a Imagem Docker: No diretório raiz do projeto (onde o
Dockerfileestá localizado), execute:docker build -t pprof-analyzer-mcp . -
Executar o Contêiner Docker:
docker run -i --rm pprof-analyzer-mcp- A flag
-imantém o STDIN aberto, o que é necessário para o transporte stdio usado por este servidor MCP. - A flag
--rmremove automaticamente o contêiner quando ele sai.
- A flag
-
Configurar o Cliente MCP para Docker: Para conectar seu cliente MCP (como Roo Cline) ao servidor em execução dentro do Docker, atualize seu
.roo/mcp.json:{ "mcpServers": { "pprof-analyzer-docker": { "command": "docker run -i --rm pprof-analyzer-mcp" } } }Certifique-se de que a imagem
pprof-analyzer-mcpfoi construída localmente antes que o cliente tente executar este comando.
Release (Automatizado via GitHub Actions)
Este projeto usa GoReleaser e GitHub Actions para automatizar o processo de release. As releases são acionadas automaticamente quando uma tag Git correspondente ao padrão v* (por exemplo, v0.1.0, v1.2.3) é enviada para o repositório.
Checklist Pré-release:
Antes de criar uma tag de release, certifique-se de:
- ✅ Todos os testes passam:
go test ./... - ✅ O código compila com sucesso:
go build - ✅ A documentação está atualizada (README, CHANGELOG, etc.)
- ✅ As mensagens de commit seguem o formato Conventional Commits
Etapas da Release:
- Fazer Alterações: Desenvolva novos recursos ou corrija bugs.
- Fazer Commit das Alterações: Faça commit das suas alterações usando o formato Conventional Commits (por exemplo,
feat: ...,fix: ...,docs: ...). Isso é importante para a geração automática do changelog.git add . git commit -m "feat: Add awesome new feature" # or git commit -m "fix: Resolve issue #42" # or git commit -m "docs: Update README for new feature" - Enviar Alterações: Envie seus commits para o branch principal no GitHub.
git push origin main - Executar Testes Pré-release: Opcionalmente, execute testes localmente antes de criar a tag:
go test ./... -v go build -v - Criar e Enviar Tag: Quando estiver pronto para lançar, crie uma nova tag Git e envie-a para o GitHub.
# Example: Create tag v0.2.0 git tag v0.2.0 # Push the tag to GitHub git push origin v0.2.0 - Release Automática: Enviar a tag acionará a GitHub Action
GoReleaserdefinida em.github/workflows/release.yml. Esta ação irá:- Compilar binários para Linux, macOS e Windows (amd64 & arm64).
- Gerar um changelog com base em Conventional Commits desde a última tag.
- Criar uma nova GitHub Release com o changelog e anexar os binários compilados e checksums como assets.
Monitorando a Release:
Você pode visualizar o progresso do workflow de release na aba "Actions" do repositório GitHub. Quando concluído, a release estará disponível em:
https://github.com/ZephyrDeng/pprof-analyzer-mcp/releases
Configurando o Cliente MCP
Este servidor usa o protocolo de transporte stdio. Você precisa configurá-lo no seu cliente MCP (por exemplo, extensão Roo Cline para VS Code).
Normalmente, isso envolve adicionar a seguinte configuração ao arquivo .roo/mcp.json na raiz do seu projeto:
{
"mcpServers": {
"pprof-analyzer": {
"command": "pprof-analyzer-mcp"
}
}
}
Nota: Ajuste o valor de command com base no seu método de compilação (go build ou go install) e na localização real do executável. Certifique-se de que o cliente MCP possa encontrar e executar este comando.
Após a configuração, recarregue ou reinicie seu cliente MCP, e ele deverá se conectar automaticamente ao servidor PprofAnalyzer.
Dependências
-
Graphviz: A ferramenta
generate_flamegraphrequer Graphviz para gerar flame graphs em SVG (o comandogo tool pprofchamadotao gerar SVG). Certifique-se de que o Graphviz esteja instalado no seu sistema e que o comandodotesteja disponível na variável de ambiente PATH do seu sistema.Instalando o Graphviz:
- macOS (usando Homebrew):
brew install graphviz - Debian/Ubuntu:
sudo apt-get update && sudo apt-get install graphviz - CentOS/Fedora:
sudo yum install graphviz # or sudo dnf install graphviz - Windows (usando Chocolatey):
choco install graphviz - Outros Sistemas: Consulte a página oficial de download do Graphviz.
- macOS (usando Homebrew):
Exemplos de Uso (via Cliente MCP)
Depois que o servidor estiver conectado, você pode chamar as ferramentas analyze_pprof e generate_flamegraph usando URIs file://, http:// ou https:// para o arquivo de perfil.
Exemplo: Analisar Perfil de CPU (formato Texto, Top 5)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu"
}
}
Exemplo: Analisar Perfil de Heap (formato Markdown, Top 10)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/heap.pprof",
"profile_type": "heap",
"top_n": 10,
"output_format": "markdown"
}
}
Exemplo: Analisar Perfil de Goroutine (formato Texto, Top 5)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/goroutine.pprof",
"profile_type": "goroutine"
}
}
Exemplo: Gerar Flame Graph para Perfil de CPU
{
"tool_name": "generate_flamegraph",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu",
"output_svg_path": "/path/to/save/cpu_flamegraph.svg"
}
}
Exemplo: Gerar Flame Graph para Perfil de Heap (inuse_space)
{
"tool_name": "generate_flamegraph",
"arguments": {
"profile_uri": "file:///path/to/your/heap.pprof",
"profile_type": "heap",
"output_svg_path": "/path/to/save/heap_flamegraph.svg"
}
}
Exemplo: Analisar Perfil de CPU (formato JSON, Top 3)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu",
"top_n": 3,
"output_format": "json"
}
}
Exemplo: Analisar Perfil de CPU (formato JSON de Flame Graph padrão)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu"
// output_format defaults to "flamegraph-json"
}
}
Exemplo: Analisar Perfil de Heap (formato JSON de Flame Graph explícito)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/heap.pprof",
"profile_type": "heap",
"output_format": "flamegraph-json"
}
}
Exemplo: Analisar Perfil de CPU Remoto (de URL HTTP)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "https://example.com/profiles/cpu.pprof",
"profile_type": "cpu"
}
}
Exemplo: Analisar Perfil de CPU Online (de URL Raw do GitHub)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "https://raw.githubusercontent.com/google/pprof/refs/heads/main/profile/testdata/gobench.cpu",
"profile_type": "cpu",
"top_n": 5
}
}
Exemplo: Gerar Flame Graph para Perfil de Heap Online (de URL Raw do GitHub)
{
"tool_name": "generate_flamegraph",
"arguments": {
"profile_uri": "https://raw.githubusercontent.com/google/pprof/refs/heads/main/profile/testdata/gobench.heap",
"profile_type": "heap",
"output_svg_path": "./online_heap_flamegraph.svg"
}
}
Exemplo: Abrir UI Interativa do Pprof para Perfil de CPU Online (somente macOS)
{
"tool_name": "open_interactive_pprof",
"arguments": {
"profile_uri": "https://raw.githubusercontent.com/google/pprof/refs/heads/main/profile/testdata/gobench.cpu"
// Optional: "http_address": ":8082" // Example of overriding the default port
}
}
Exemplo: Detectar Vazamentos de Memória Entre Dois Perfis de Heap
{
"tool_name": "detect_memory_leaks",
"arguments": {
"old_profile_uri": "file:///path/to/your/heap_before.pprof",
"new_profile_uri": "file:///path/to/your/heap_after.pprof",
"threshold": 0.05, // 5% growth threshold
"limit": 15 // Show top 15 potential leaks
}
}
Exemplo: Desconectar uma Sessão Pprof
{
"tool_name": "disconnect_pprof_session",
"arguments": {
"pid": 12345 // Replace 12345 with the actual PID returned by open_interactive_pprof
}
}
Melhorias Futuras (TODO)
- Adicionar tratamento de tipo MIME nos resultados MCP com base em
output_format. - Adicionar tratamento de erros mais robusto e controle de nível de logging.
- Adicionar testes de integração para interações ponta a ponta das ferramentas MCP.
- Otimizações de desempenho para arquivos de perfil grandes (>1GB).
Recentemente Concluído (v0.3.0)
- ✅
Implementar gráficos de chama diferenciais para visualizar mudanças entre perfis.(Concluído - ferramentacompare_profiles) - ✅
Adicionar análise de séries temporais para perfis de memória para rastrear crescimento ao longo de múltiplos snapshots.(Concluído - ferramentaanalyze_heap_time_series) - ✅ Adicionar CI/CD automatizado com GitHub Actions testando em cada PR.
- ✅
Implementar lógica de análise completa para perfis(Concluído em v0.2.0)mutex,block. - ✅
Implementar formato de saída(Concluído em v0.2.0)jsonpara tipos de perfilmutex,block. - ✅ Migrado para o Model Context Protocol Go SDK oficial.
- ✅
Considerar suporte a URIs de arquivos pprof remotos (por exemplo,(Concluído em v0.2.0)http://,https://). - ✅
Implementar lógica de análise completa para perfis(Concluído em v0.2.0)allocs. - ✅
Implementar formato de saída(Concluído em v0.2.0)jsonpara o tipo de perfilallocs. - ✅
Adicionar capacidades de detecção de vazamento de memória.(Concluído em v0.2.0)