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

big*_*ato 5 memory-leaks node.js graphql apollo-server

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

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

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

这是查找内存泄漏的正确流程吗?有没有更好的方法来做到这一点而不必猜测它来自哪个端点?是否有我可以在线使用的工具可以帮助我找到生产中内存泄漏的来源,而不必像这样猜测?也许像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}`);
  });
});
Run Code Online (Sandbox Code Playgroud)

小智 -1

您可以尝试使用Clinic来调试和分析该应用程序。非常好的nodeJS工具。