Cloudflare 宣布为 Workers 和 Durable Objects 服务提供按需分析处理器与内存使用情况的功能,使开发者能够直接从生产环境收集性能分析文件,并以交互式火焰图的形式查看。该功能可以确定消耗处理器时间或分配最多内存的函数,而不必仅依赖日志和汇总指标。
可以从 Cloudflare 控制面板中的 Workers Observability 页面,或通过命令行界面启动性能分析。开发者可以指定文件类型,即 CPU 或 memory,以及收集时长,还可以选择不同版本的 Worker。会话结束后,可以查看交互式图表,并下载性能分析文件,以便使用其他工具进行分析。
火焰图展示什么?
图表中的每个矩形代表一次函数调用,其宽度反映与该函数相关的处理器时间或内存量。可以点击函数以放大查看,也可以使用表格视图,按样本数量对结果排序。Cloudflare 建议捕获多个文件并查找宽度较大的函数,同时在 TypeScript 项目中启用 source maps,以免函数名称显示得含糊不清。
性能分析需要选择一个能够接收足够流量的已发布版本;该服务不会为了测量而创建新的隔离环境,因为目标是监控生产环境中的真实执行情况。可以使用以下命令捕获一份持续五秒的 CPU 性能分析文件:
cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof
Cloudflare 展示的实际结果
Cloudflare 使用该工具分析了一个执行 R2 绑定的 Worker。性能分析显示,genericR2JsonReplacer 函数在执行 JSON.stringify 期间反复遍历 JSON 树,导致某些情况下对嵌套值处理了五次。修复该问题后,该函数的速度提高了 2.7 倍。性能分析还发现对 metrics 的重复调用,存储结果并重新使用结果就足以降低处理器消耗。
在另一个案例中,一个 Worker 超过了 128 兆字节的内存上限,其 P999 使用量约为 133 兆字节,并因此产生“Exceeded Memory”错误。堆文件显示,负责约 66.7% 分配的 Prometheus 代码在被认为已禁用的情况下仍有部分运行。完全移除这段代码路径后,P999 从 133 兆字节降至 118 兆字节,而 P50 则从 70 兆字节降至 54 兆字节。
实际会发生什么变化?
该功能使开发团队能够直接了解 Workers 在实际条件下的执行情况,因为流量和隔离环境分布可能不同于本地开发环境。平台负责处理 Workers 分布在多个数据中心和设备上的复杂性;而对于 Durable Objects,开发者可以按名称指定对象,以获取其所运行的特定隔离环境的性能分析文件。
执行机制会在收集期间继续接收请求;只有在开始和停止性能分析时才会持有隔离环境锁,随后在指定时长内以一毫秒的间隔收集 CPU 样本。Durable Objects 则利用其有状态特性,将性能分析请求路由至指定对象所在的隔离环境和对象所有者。
限制与下一步
性能分析不会自动开始,因此会话可能错过发生问题的短暂或罕见时段。此外,内存分析器只会展示测量窗口期间发生的分配,不一定能够捕获启动所产生的使用量。Cloudflare 表示正在开发持续性能分析功能,该功能将自动收集样本,并允许之后从控制面板查看这些样本。