开源项目
grafana/pyroscope avatar
grafana/pyroscope

Pyroscope 2.0:把持续 profiling 直接写进对象存储,运维简化了多少

连续分析平台。将性能问题调试到一行代码。

11,658 个 Star802 个 ForkGoAGPL-3.0

秒懂

它是什么?
Grafana Pyroscope 2.0 将 profiling 数据直接写入对象存储,去掉了内存 ingester 和本地磁盘。本文拆解它的写入、压缩与查询路径,并给出上手命令与适用边界。
适合谁用?
Pyroscope 适合已经或打算把可观测性数据集中到对象存储的团队,尤其是那些需要跨服务排查 CPU、内存和 I/O 瓶颈,并且愿意接受 AGPL-3.0 约束的工程组织。不适合只想在单机上快速看火焰图、不想引入对象存储依赖的临时需求。
能商用吗?
可以,但条件严格。AGPL-3.0 是网络 copyleft 许可证:如果别人通过网络使用你修改过的版本(例如作为托管服务),你必须以同一许可证向他们提供源代码。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Go(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

持续 profiling 要解决什么问题

Pyroscope 面向的是性能问题的持续观测,而不是一次性的采样分析。传统做法是等线上出问题,再临时挂 profiler 抓几分钟,这往往错过现场。Pyroscope 的做法是让应用持续上报 profiling 数据,服务器端存储并支持事后查询。典型场景分两类:主动降低资源消耗、防止延迟恶化,以及被动地以行级细节定位正在发生的 CPU、内存或 I/O 瓶颈。它的目标用户是运维和 SRE 团队,他们需要跨服务的性能视图,而不是单台机器的孤岛数据。Pyroscope 把 profiling 数据当作与日志、指标同等地位的可观测性信号,这一点决定了它的架构设计。

v2 架构:去 ingester,直写对象存储

Pyroscope 2.0 最核心的变化是写路径。v1 依赖内存 ingester 和本地磁盘,先缓冲再落盘,这带来额外的运维负担和资源消耗。v2 把 profile 按服务路由,直接写入对象存储,比如 S3 或 GCS。README 明确说,v2 没有 ingester、没有本地磁盘。这意味着部署时不需要规划内存缓冲区大小,也不需要担心磁盘写满。但代价是对象存储的写入延迟和查询延迟成为新的瓶颈。压缩路径由后台 compaction-worker 负责,把小段合并成大块,这类似于列式存储的 compaction 机制。读路径则是查询时跨对象存储扇出,构建火焰图。整个架构的取舍很清楚:用更简单的写入路径换取更复杂的查询路径,因为查询频率远低于写入频率。

快速启动:一条 Docker 命令

本地跑一个 Pyroscope 服务非常简单。官方 README 给出了 Docker 方式:docker run -it -p 4040:4040 grafana/pyroscope。服务默认监听 4040 端口。macOS 或 Linux 用户也可以用 Homebrew:brew install pyroscope-io/brew/pyroscope,然后 brew services start pyroscope。二进制方式则是从 release 页面下载对应平台的压缩包,解压后直接运行 ./pyroscope。这三种方式都不需要额外配置,适合先跑起来看效果。但要接入真实数据,还需要配置 SDK 或采集器。数据上报有三种途径:Pyroscope 语言 SDK 主动推送,Grafana Alloy 拉取或推送,以及通过 OTLP 从 OpenTelemetry 兼容源(比如 eBPF profiler)接入。选择哪种取决于你的应用语言和现有监控栈。

可视化:Grafana Profiles Drilldown

数据进到 Pyroscope 之后,官方推荐的可视化工具是 Grafana Profiles Drilldown,它以前叫 Explore Profiles。这个工具的特点是 queryless,也就是不需要写查询语句,直接通过界面钻取。它预装在 Grafana Cloud 和 Grafana OSS 中,只要开始发送数据就能用。README 给出的流程是:先启动 Pyroscope 服务,然后配置客户端发送数据,最后在 Grafana 中打开 Profiles Drilldown 查看火焰图。这个工具的核心价值是把 profiling 数据变成可交互的探索体验,而不是像传统 profiler 那样导出文件再分析。但要注意,Drilldown 是 Grafana 生态的一部分,如果你不用 Grafana,就得自己找其他可视化方案,README 没有提供独立的 UI。

语言 SDK 覆盖与接入方式

Pyroscope 提供了多种语言的 SDK,README 中明确列出了 Golang、Java、Python 三种,并附有文档和示例链接。Golang 采用 push 模式,Java 和 Python 也有对应的 SDK。此外,Grafana Alloy 支持 pull 或 push 两种方式,适合那些不想改应用代码的场景。OpenTelemetry eBPF profiler 则提供了另一种路径,通过 OTLP 协议接入,适合需要无侵入采集的场景。这意味着接入方式有梯度:SDK 最灵活但需要改代码,Alloy 适合已有 Agent 的部署,eBPF 适合容器环境但可能有内核版本要求。README 没有给出各 SDK 的详细配置,实际接入时还需要查阅对应文档。对于多语言团队,SDK 的覆盖范围是一个需要提前确认的点。

v1 到 v2 的迁移路径

对于已经在用 v1 的用户,Pyroscope 2.0 提供了迁移选项。README 说明,现有 v1 部署可以通过一个 flag 选择启用 v2 架构,并且迁移过程不会丢失数据。迁移指南链接指向官方文档,但没有给出具体的 flag 名称和迁移步骤。这一点需要用户自己去查阅 v2 架构文档。从架构角度看,迁移的核心是数据格式和存储位置的改变,v1 的本地磁盘数据需要被转换或重新写入对象存储。这个迁移不是零成本的,涉及存储迁移和可能的查询行为变化。如果你是 v1 用户,应该先在小规模环境测试迁移,确认查询结果和性能符合预期,再全量切换。

许可证与运维成本

Pyroscope 采用 AGPL-3.0 许可证。这意味着如果你修改了代码并对外提供服务,需要开源你的修改版本。对于内部使用,AGPL 的限制相对宽松,但如果你的公司有严格的许可证合规要求,需要法务确认。运维成本方面,v2 架构减少了内存和磁盘管理,但引入了对象存储的依赖。你需要配置对象存储的访问凭证、生命周期策略和 compaction 的调度。Pyroscope 本身是 Go 写的,部署形态是单一二进制,这简化了安装。但生产环境通常需要 Kubernetes 部署,README 提到了 Helm 和部署指南,但没有给出具体配置。升级方面,v2.3.0 是当前最新版本,v2.2.1 和 v2.1.2 也在维护中,说明项目迭代活跃。升级前需要检查兼容性,尤其是 SDK 版本与服务端版本的匹配。

适用边界与替代方案

Pyroscope 不是万能的。如果你的 profiling 需求只是偶尔在开发环境抓一次 CPU 火焰图,用 Perf 或 Go 自带的 pprof 就足够,不需要部署一个持续 profiling 平台。Pyroscope 的持续采集模式会产生持续的数据写入和存储成本,对于小规模应用可能不划算。另一个替代方案是 OpenTelemetry 的 profiling 能力,Pyroscope 本身支持通过 OTLP 接入,说明它和 OpenTelemetry 生态有重叠。但 OpenTelemetry 的 profiling 还在发展中,Pyroscope 提供了更成熟的存储和查询层。如果你已经重度使用 OpenTelemetry,可以考虑用 eBPF profiler 配合 Pyroscope 后端,而不是引入独立的 SDK。Pyroscope 的优势在于与 Grafana 生态的整合,如果你不用 Grafana,它的价值会打折扣。

编辑结论

Pyroscope 适合已经或打算把可观测性数据集中到对象存储的团队,尤其是那些需要跨服务排查 CPU、内存和 I/O 瓶颈,并且愿意接受 AGPL-3.0 约束的工程组织。不适合只想在单机上快速看火焰图、不想引入对象存储依赖的临时需求。采用前需要先验证三件事:你现有的 SDK 或采集方式是否支持 OTLP 或 Pyroscope 协议,v1 部署能否按迁移指南无损升级,以及对象存储的访问延迟是否满足你的查询预期。Pyroscope 2.0 的核心判断是:它把 profiling 的运维成本从内存管理转移到了对象存储管理,如果你的基础设施已经围绕 S3 或 GCS 构建,这个转移是划算的;如果不是,v1 的本地磁盘模式可能仍然更合适。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记