了解 Worker 内存使用情况有助于优化性能、在达到 Worker 内存限制 时避免内存不足(OOM)错误,以及修复内存泄漏。
您可以使用 DevTools 快照分析内存使用情况。内存快照让您查看内存使用摘要、了解不同数据类型占用的内存量,并获取内存中特定对象的详细信息。
使用 DevTools 分析内存时,可能难以复现生产环境中观察到的特定行为。要模拟生产行为,请确保发送到本地 Worker 的请求与生产环境中的请求相似。这可能意味着发送大量请求、向特定路由发送请求,或使用 --remote 标志配合类似生产环境的数据。
要生成内存快照:
- 运行
wrangler dev启动 Worker - 在终端中按
D键打开 DevTools - 选择 Memory(内存) 标签页
- 向 Worker 发送请求以开始分配内存
- 可选:包含调试器以确保能在合适的时间暂停执行
- 选择 Take snapshot(拍摄快照)
您现在可以检查 Worker 内存。
让我们通过一个示例学习如何阅读内存快照。假设您有以下 Worker:
let responseText = "Hello world!";
export default {
async fetch(request, env, ctx) {
let now = new Date().toISOString();
responseText = responseText + ` (Requested at: ${now})`;
return new Response(responseText.slice(0, 53));
},
};这段代码最初运行良好,但随着时间推移,您注意到响应变慢并出现内存不足错误。使用 DevTools,您可以查明是否存在内存泄漏。
首先,如上所述,运行 wrangler dev 后按 D 键打开 DevTools。
然后,导航到 "Memory" 标签页。
接下来,通过发送请求生成大量流量。您可以使用 curl 或反复刷新浏览器。请注意,其他 Worker 可能需要更特定的请求才能复现内存泄漏。
然后,点击 "Take Snapshot" 按钮并查看结果。
首先,在下拉菜单中导航到 "Statistics" 以大致了解内存占用情况。
查看这些统计数据,您可以看到大量内存(67 kB)用于字符串。这很可能是内存泄漏的来源。如果您发送更多请求并采集另一个快照,会看到此数字不断增长。
内存摘要按内存占用量列出数据类型。点击 "(string)" 后,您可以看到一个远大于其他的字符串。文本显示您反复追加 "Requested at" 和日期,无意中用越来越大的字符串覆盖了全局变量:
responseText = responseText + ` (Requested at: ${now})`;使用 DevTools 的内存快照功能,您已识别出导致内存泄漏的对象和代码行。 现在可以通过小幅代码修改来修复它。
要了解如何使用内存快照,请参阅 Google 关于内存堆快照的文档 ↗。
要了解如何使用 DevTools 洞察 CPU 使用情况,请参阅 CPU 分析文档。