首页 > 解决方案 > 无法追踪 Node JS 内存泄漏

问题描述

在我们的第一个大型 Node/React 同构 Web 应用程序上,我们正在努力解决内存泄漏问题。在 48 小时或更短的时间内,我们使用了超过 500mb 的内存。应用程序所做的大部分工作是从 graphql 服务器获取 json 并使用该数据来制作由 React 组件组成的网页。应用程序中还有一些其他数据源用于特殊内容,但在大多数情况下,应用程序的肉和土豆是对 React 组件的 graphql 查询。我们用来帮助​​的一些库包括 Express、NextJS 和 Apollo Client。

在我们的服务器上,我们使用 CDN 将 html 页面缓存 60 秒,然后使用 Apache 从端口 443 (ssl) 代理到我们运行节点的端口。

以下是我们试图解决此泄漏的方法:

我尝试过的其他事情:

我们即将做的其他事情:

到目前为止,我只能做出这些观察:

如果有帮助,我可以发布内存堆快照。真的希望有人能指出我哪里出错了,或者至少提供一些好的提示。

最初的反馈是获取 prod 堆快照,所以我现在有一些 prod 堆快照来解释它们是一个挑战,因为我读到这很难解释。这都是匿名流量,所以如果您想查看这里的快照,它们是:第一个第二个最后一个,它们使用 bzip2 压缩以减少下载大小。第一个是在部署之后,所以节点重新启动,下一个是从那天晚上开始,最后一个是第二天早上

与之前的快照比较

这是上一张截图与上一张截图的对比

与第一个快照后分配的对象比较的摘要视图 与第一个快照后分配的对象比较的摘要视图

让这变得困难的是我看不到我们在那里写的代码,除非我钻进去

标签: node.jsmemory-leaksisomorphic-javascript

解决方案


在这种情况下,答案是从应用程序中删除 Express。我们只使用 Express 进行路由,幸运的是 NextJs 几乎同时实现了自己的路由。我们所做的唯一另一件事是将 api 调用移至 NWS 天气 api 调用,使其成为 100% 客户端。

之后,内存泄漏消失了。


推荐阅读