为 Workers 和 Durable Objects 推出按需 CPU 与内存性能分析及火焰图功能

💡 原文英文,约2400词,阅读约需9分钟。
📝

内容提要

Cloudflare 为 Workers 和 Durable Objects 推出按需 CPU 与内存性能分析功能,用户可通过 CLI 或仪表板对生产环境中的 Worker 采样,生成交互式火焰图并下载分析。文章举例说明如何借此发现重复计算、优化 CPU 占用并定位内存泄漏,将 P999 内存从 133MB 降至 118MB。该功能无需停止 Worker 即可采样,未来将支持持续分析。

🔎

延伸解读

生产环境按需采样:无需停机的性能诊断

该功能允许对生产环境中的 Worker 或 Durable Object 发起按需 CPU 或内存采样,采样期间 Worker 继续处理请求,不会中断服务。这解决了本地 profiling 无法复现生产流量特征的问题,尤其适合排查仅在真实负载下出现的性能瓶颈或内存异常。

火焰图与表格视图:快速定位热点函数

火焰图中每个矩形代表一个函数调用,宽度反映其消耗的 CPU 时间或内存分配量。结合表格视图按样本数排序,可以快速发现占用资源最高的函数。文章中的案例正是通过表格视图发现 genericR2JsonReplacer 存在递归重复计算,优化后该函数速度提升 2.7 倍。

内存分析实战:从 P999 133MB 降至 118MB

文章分享了一个内部 Worker 因内存超限频繁被驱逐的案例。通过堆分析发现,本应禁用的 Prometheus 代码仍部分运行,占用了约 66.7% 的内存分配。彻底移除该代码路径后,P999 内存从 133MB 降至 118MB,在 128MB 限制下获得约 10MB 余量,显著减少了“Exceeded Memory”错误。

当前限制与持续分析展望

按需分析需要手动启动,可能错过故障发生的关键时段;内存分析仅能捕获采样窗口内的分配,启动阶段的大量分配不会被记录。此外,Worker 需有足够流量才能成功采样,TypeScript 项目需启用 source maps 以避免函数名混淆。Cloudflare 正在开发持续分析功能,未来可自动捕获样本,便于回溯罕见事件。

❓

Q&A

Cloudflare 为 Workers 和 Durable Objects 推出了什么新功能?

Cloudflare 推出了按需 CPU 与内存性能分析及火焰图功能,用户可以通过 CLI 或仪表板对生产环境中的 Worker 进行采样,生成交互式火焰图并下载分析文件。

如何使用 CLI 对 Worker 进行 CPU 性能分析?

确保已安装 cf 包,然后运行命令:cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof。

火焰图如何帮助定位性能问题?

火焰图中的每个矩形代表一个函数调用,宽度表示该函数使用的 CPU 时间或内存量。可以点击函数聚焦,悬停查看详情,通过寻找最宽的矩形来确定哪些函数消耗资源最多。

Cloudflare 内部如何利用性能分析解决内存问题?

一个 Worker 的 P999 内存达到 133MB,接近 128MB 限制,导致频繁被驱逐。通过堆分析发现 Prometheus 代码占用了约 66.7% 的内存分配,尽管该代码本应被禁用。完全移除后,P999 内存降至 118MB,提供了约 10MB 的余量。

对 Durable Objects 进行性能分析与普通 Workers 有何不同?

Durable Objects 是有状态的,具有名称,因此可以按名称选择要分析的具体对象。运行时会将分析请求路由到拥有该特定 actor 的金属服务器,并提供运行该对象的特定 isolate 的分析结果。

按需性能分析有哪些局限性?

必须显式启动分析会话,可能错过 Worker 行为异常的重要时间段;内存分析器只能显示分析窗口内发生的分配,如果 Worker 在启动时分配大量内存,则无法看到。

未来 Cloudflare 在性能分析方面有什么计划?

Cloudflare 正在开发持续分析功能,将自动捕获 Worker 的分析样本,使用户可以直接在仪表板中探索分析结果,从而更容易捕获罕见事件。

🏷️

标签

➡️

继续阅读