如果 Worker 在 CPU 密集型任务上花费过多时间,响应可能会变慢,或者 Worker 可能因启动时间限制而无法启动。
在 DevTools 中进行性能分析可以帮助您识别并修复占用过多 CPU 的代码。
在生产环境中测量特定函数的执行时间可能比较困难,因为出于安全考虑,Workers 仅在 I/O 时递增计时器。但在本地开发中使用 DevTools 可以测量 CPU 执行时间。
使用 DevTools 监控 CPU 使用情况时,可能难以复现生产环境中观察到的特定行为。要模拟生产行为,请确保发送到本地 Worker 的请求与生产环境中的请求相似。这可能意味着发送大量请求、向特定路由发送请求,或通过远程绑定(remote bindings)使用类似生产环境的数据。
要生成 CPU 性能分析:
- 运行
wrangler dev启动 Worker - 在终端中按
D键打开 DevTools - 选择 Profiler(性能分析器) 标签页
- 选择
Start开始记录 CPU 使用情况 - 在新标签页中向 Worker 发送请求
- 选择
Stop
您现在拥有 CPU 性能分析数据。
让我们通过一个示例学习如何阅读 CPU 性能分析。假设您有以下 Worker:
const addNumbers = (body) => {
for (let i = 0; i < 5000; ++i) {
body = body + " " + i;
}
return body;
};
const moreAddition = (body) => {
for (let i = 5001; i < 15000; ++i) {
body = body + " " + i;
}
return body;
};
export default {
async fetch(request, env, ctx) {
let body = "Hello Profiler! - ";
body = addNumbers(body);
body = moreAddition(body);
return new Response(body);
},
};您想找出代码的哪一部分导致响应时间变慢。如何使用 DevTools 性能分析来识别 CPU 密集型代码并修复问题?
首先,如上所述,运行 wrangler dev 后按 D 键打开 DevTools。然后,导航到 "Profiler" 标签页,按 Start 并发送请求来采集性能分析数据。
此图像顶部的图表显示性能分析的时间线,您可以用它放大查看特定请求。
下方图表显示请求执行期间各操作使用的 CPU 时间。在此截图中,您可以在顶部看到 "fetch" 时间,下方是其子组件,包括 addNumbers 和 moreAdditions 两个函数。将鼠标悬停在每个方框上可获取更多信息,点击方框可导航到函数的源代码。
使用此图表,您可以回答"什么占用了 CPU 时间?"的问题。addNumbers 函数的方框很小,代表 0.3ms 的 CPU 时间。moreAdditions 方框较大,代表 2.2ms 的 CPU 时间。
因此,如果您想加快响应速度,需要优化 moreAdditions。
您还可以将可视化从「Chart」切换为「Heavy (Bottom Up)」以获得另一种视图。
这显示了各函数分配时间的相对比例。列表顶部,moreAdditions 显然是 Worker 中最慢的部分。您还可以看到垃圾回收也占用了大量时间,因此内存优化也可能有所帮助。
要了解如何使用 CPU 分析器,请参阅 Google 关于在 DevTools 中分析 CPU 的文档 ↗。
要了解如何使用 DevTools 洞察内存使用情况,请参阅内存使用文档。