简体中文 | English
[
](https://github.com/ZephyrD
eng/pprof-analyzer-mcp/actions)
这是一个用 Go 实现的 Model Context Protocol (MCP) 服务器,提供了一个工具来分析 Go pprof 性能配置文件。
analyze_pprof 工具:
cpu:分析代码执行期间的 CPU 时间消耗以找到热点。heap:分析当前内存使用情况(堆分配)以找到高内存消耗的对象和函数。增强对象计数、分配位置和类型信息。goroutine:显示所有当前 goroutine 的堆栈跟踪,用于诊断死锁、泄漏或过度使用 goroutine。allocs:分析程序执行期间的内存分配(包括已释放的)以定位频繁分配的代码。提供详细的分配位置和对象计数信息。mutex:分析互斥锁的竞争以找到导致阻塞的锁。(尚未实现)block:分析导致 goroutine 阻塞的操作(例如,通道等待、系统调用)。(尚未实现)text,markdown,json(Top N 列表),flamegraph-json(分层火焰图数据,默认)。
text,markdown:人类可读的文本或 Markdown 格式。json:以结构化 JSON 格式输出 Top N 结果(已实现 cpu,heap,goroutine,allocs)。flamegraph-json:以 JSON 格式输出分层火焰图数据,兼容 d3-flame-graph(已实现 cpu,heap,allocs,默认格式)。输出是紧凑的。top_n,默认值为 5,适用于 text,markdown,json 格式)。generate_flamegraph 工具:
go tool pprof 为指定的 pprof 文件生成火焰图(SVG 格式),保存到指定路径,并返回路径和 SVG 内容。cpu,heap,allocs,goroutine,mutex,block。open_interactive_pprof 工具(仅限 macOS):
go tool pprof 交互式 Web UI。如果没有提供 http_address,默认使用端口 :8081。pprof 进程的进程 ID (PID)。go 命令在系统的 PATH 中可用。pprof 进程的错误不会被捕获。从远程 URL 下载的临时文件不会自动清理,直到进程终止(通过 disconnect_pprof_session 手动断开连接或 MCP 服务器退出)。detect_memory_leaks 工具:
disconnect_pprof_session 工具:
open_interactive_pprof 启动的后台 pprof 进程。您可以直接使用 go install 安装此包:
go install github.com/ZephyrDeng/pprof-analyzer-mcp@latest
这将把 pprof-analyzer-mcp 可执行文件安装到您的 $GOPATH/bin 或 $HOME/go/bin 目录中。确保此目录在您的系统 PATH 中,以便可以直接运行命令。
确保您已安装 Go 环境(推荐 Go 1.18 或更高版本)。
在项目根目录(pprof-analyzer-mcp)中运行:
go build
这将在当前目录生成一个名为 pprof-analyzer-mcp(或 Windows 上的 pprof-analyzer-mcp.exe)的可执行文件。
go install(推荐)您也可以使用 go install 将可执行文件安装到您的 $GOPATH/bin 或 $HOME/go/bin 目录中。这允许您直接从命令行运行 pprof-analyzer-mcp(如果该目录添加到了您的系统 PATH 环境变量中)。
# 使用 go.mod 中定义的模块路径安装可执行文件
go install .
# 或直接使用 GitHub 路径(发布后推荐)
# go install github.com/ZephyrDeng/pprof-analyzer-mcp@latest
使用 Docker 是一种方便的方式来运行服务器,因为它捆绑了必要的 Graphviz 依赖项。
构建 Docker 镜像: 在项目根目录(Dockerfile 所在的位置)中运行:
docker build -t pprof-analyzer-mcp .
运行 Docker 容器:
docker run -i --rm pprof-analyzer-mcp
-i 标志保持 STDIN 打开,这对于此 MCP 服务器使用的 stdio 传输是必需的。--rm 标志会在容器退出时自动删除容器。配置 MCP 客户端以使用 Docker:
要将您的 MCP 客户端(如 Roo Cline)连接到运行在 Docker 中的服务器,请更新您的 .roo/mcp.json:
{
"mcpServers": {
"pprof-analyzer-docker": {
"command": "docker run -i --rm pprof-analyzer-mcp"
}
}
}
确保在客户端尝试运行此命令之前,本地已经构建了 pprof-analyzer-mcp 镜像。
此项目使用 GoReleaser 和 GitHub Actions 来自动化发布过程。当与模式 v* 匹配的 Git 标签(例如 v0.1.0,v1.2.3)推送到仓库时,会自动触发发布。
发布步骤:
feat: ...,fix: ...)。这对于自动生成变更日志很重要。
git add .
git commit -m "feat: 添加了很棒的新功能"
# 或
git commit -m "fix: 解决问题 #42"
git push origin main
# 示例:创建标签 v0.1.0
git tag v0.1.0
# 将标签推送到 GitHub
git push origin v0.1.0
.github/workflows/release.yml 中定义的 GoReleaser GitHub Action。此操作将:
您可以在 GitHub 仓库的“Actions”选项卡中查看发布工作流的进度。
此服务器使用 stdio 传输协议。您需要在您的 MCP 客户端(例如,VS Code 的 Roo Cline 扩展)中对其进行配置。
通常,这涉及在项目根目录的 .roo/mcp.json 文件中添加以下配置:
{
"mcpServers": {
"pprof-analyzer": {
"command": "pprof-analyzer-mcp"
}
}
}
注意: 根据您的构建方法(go build 或 go install)和实际可执行文件的位置调整 command 值。确保 MCP 客户端可以找到并执行此命令。
配置完成后,重新加载或重启您的 MCP 客户端,它应该自动连接到 PprofAnalyzer 服务器。
Graphviz:generate_flamegraph 工具需要 Graphviz 来生成 SVG 火焰图(go tool pprof 命令在生成 SVG 时调用 dot)。确保 Graphviz 已安装在您的系统上,并且 dot 命令在您的系统 PATH 环境变量中可用。
安装 Graphviz:
macOS(使用 Homebrew):
brew install graphviz
Debian/Ubuntu:
sudo apt-get update && sudo apt-get install graphviz
CentOS/Fedora:
sudo yum install graphviz
# 或
sudo dnf install graphviz
Windows(使用 Chocolatey):
choco install graphviz
其他系统: 请参阅 Graphviz 官方下载页面。
一旦服务器连接成功,您可以使用 file://,http:// 或 https:// URI 对 analyze_pprof 和 generate_flamegraph 工具进行调用。
示例:分析 CPU 配置文件(文本格式,Top 5)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu"
}
}
示例:分析堆配置文件(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"
}
}
示例:分析 goroutine 配置文件(文本格式,Top 5)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/goroutine.pprof",
"profile_type": "goroutine"
}
}
示例:为 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"
}
}
示例:为堆配置文件生成火焰图(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"
}
}
示例:分析 CPU 配置文件(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"
}
}
示例:分析 CPU 配置文件(默认火焰图 JSON 格式)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/cpu.pprof",
"profile_type": "cpu"
// output_format 默认为 "flamegraph-json"
}
}
示例:分析堆配置文件(显式火焰图 JSON 格式)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "file:///path/to/your/heap.pprof",
"profile_type": "heap",
"output_format": "flamegraph-json"
}
}
示例:分析远程 CPU 配置文件(来自 HTTP URL)
{
"tool_name": "analyze_pprof",
"arguments": {
"profile_uri": "https://example.com/profiles/cpu.pprof",
"profile_type": "cpu"
}
}
示例:分析在线 CPU 配置文件(来自 GitHub Raw URL)
{
"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
}
}
示例:为在线堆配置文件生成火焰图(来自 GitHub Raw URL)
{
"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"
}
}
示例:打开在线 CPU 配置文件的交互式 Pprof UI(仅限 macOS)
{
"tool_name": "open_interactive_pprof",
"arguments": {
"profile_uri": "https://raw.githubusercontent.com/google/pprof/refs/heads/main/profile/testdata/gobench.cpu"
// 可选:"http_address": ":8082" // 示例覆盖默认端口
}
}
示例:检测两个堆配置文件之间的内存泄漏
{
"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% 增长阈值
"limit": 15 // 显示前 15 个潜在泄漏
}
}
示例:断开 Pprof 会话
{
"tool_name": "disconnect_pprof_session",
"arguments": {
"pid": 12345 // 替换 12345 为 `open_interactive_pprof` 返回的实际 PID
}
}
mutex,block 配置文件的完整分析逻辑。mutex,block 配置文件类型的 json 输出格式。output_format 设置 MCP 结果中的适当 MIME 类型。http://,https://)的支持。(已完成)allocs 配置文件的完整分析逻辑。(已完成)allocs 配置文件类型的 json 输出格式。(已完成)