如何调试 Apollo GraphQL 服务器上的内存泄漏?

Posted

技术标签:

【中文标题】如何调试 Apollo GraphQL 服务器上的内存泄漏?【英文标题】:How can I debug a memory leak on my Apollo GraphQL server? 【发布时间】:2020-03-12 19:00:13 【问题描述】:

我有一个带有多个端点的 graphql 服务器。它基本上只是一个 CRUD 应用程序,所以老实说我不确定为什么会有内存泄漏。我拥有的唯一可能泄漏的端点是将图片上传到 S3 的端点。

我一直在环顾四周,并尝试拍摄堆快照并进行比较,但我什至不确定哪个端点是罪魁祸首。这是我一直关注的流程:

    使用--inspect 标志启动服务器:nodemon --inspect --exec babel-node src/index.js 在我做任何事情之前拍摄堆快照 启动我的前端应用程序并点击我认为有内存泄漏的端点(我上传照片的那个) 再次拍摄堆快照并比较两者

这是查找内存泄漏的正确流程吗?有没有更好的方法来做到这一点而不必猜测它来自哪个端点?是否有我可以在线使用的工具可以帮助我找到生产中内存泄漏的来源而不必像这样猜测?也许像 Datadog 之类的?

更新:从 Heroku 的指标来看,似乎每次发出请求时内存使用量都会增加?

但是我的 src/index.js 文件没有做任何特别的事情:

import  ApolloServer, gql  from "apollo-server";
import  connectDb, models  from "./models";

import schema from "./schema";
import resolvers from "./resolvers";
import contexts from "./contexts";

const server = new ApolloServer(
  typeDefs: schema,
  resolvers,
  context: async ( req, connection ) => 
    console.log(req.body.query);
    console.log(req.body.variables);

    const  getCurrentUser  = contexts;

    const currentUser = await getCurrentUser(req);
    return  models, currentUser ;
  ,
);

connectDb().then(async () => 
  server.listen( port: process.env.PORT || 4000 ).then(( url ) => 
    console.log(`????  Server ready at $url`);
  );
);

【问题讨论】:

你找到答案了吗,我们在上传图片和 aws 时遇到了同样的问题。 【参考方案1】:

您可以尝试使用clinic 来调试和分析应用程序。相当不错的nodeJS工具。

【讨论】:

【参考方案2】:

您可以使用node-memwatch 来检测内存泄漏的位置。

这也可能是一个已知问题,这里是 link 有类似问题。

【讨论】:

node-memwatch 不适用于最新版本的节点。我自己用的是 12+。 @AlexisTyler 你可以尝试使用@airbnb/node-memwatch fork mentioned here;我能够让它在节点 14 上运行(特别是在使用 FROM node:14-alpine 作为基础映像的 Docker 容器中)。【参考方案3】:

你走在正确的道路上。我将要链接到的指南首先采用与您所采用的方法类似的方法。我将链接到讨论实时监控内存的部分,当您在 chrome://inspect 中Record allocation timeline 时可以使用该部分

https://marmelab.com/blog/2018/04/03/how-to-track-and-fix-memory-leak-with-nodejs.html#watching-memory-allocation-in-real-time

【讨论】:

以上是关于如何调试 Apollo GraphQL 服务器上的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Apollo 处理 GraphQL 错误?

将 Apollo 反应到不同端口上的 graphql-php 服务器

React Native 上的 GraphQL Apollo 类型生成

将Apollo反应到不同端口上的graphql-php服务器

外部 WebSocket 服务器上的 Apollo-Server GraphQL 订阅

如何从 graphQL apollo 突变或查询上的 cookie 更新授权标头