快速内存泄漏

时间:2018-12-04 14:46:26

标签: node.js express memory-leaks out-of-memory

更多代码+信息,位于:https://github.com/expressjs/express/issues/3817

我有一个系统,可以分析文件中的某些数据,然后通过POST将其发送到Express API。

数据大小小于1Mb。

我每秒向我的api发送大约7个请求(每秒解析7个文件),这是API代码:

api.post('/data', async (req, res) => {
    let data = req.body.data;

    if (data) {
        log.info('Saving data : ' + data.filePath);

        let newData = await saveData(data);
        log.info('Finished saving data : ' + data.filePath);
        res.status(201).json(newData._id);
    }
    else
        res.status(400).end();
});

saveData函数:

async function saveData(d) {
    let x = await OtherData.findOneAndUpdate(...);
    //some processing...
    return Data.findByIdAndUpdate(d._id, d, {new: true, upsert: true});
}

如果我用日志检查api的输出,那一瞬间我就能看到这两行。另外,一旦我停止发送数据,就不再看到日志输出,因此没有延迟或请求堆积,它肯定可以处理7个请求/秒(我认为)。

我尝试了chrome调试器,这就是我得到的:

enter image description here

大小一直保持快速增长,直到达到最大值,然后关闭服务器。此外,一旦我停止发送数据,它就不会立即释放内存,我需要等待几分钟。

如果您对正在发生的事情有任何想法,或者对如何更有效地进行跟踪有任何建议,那就太好了。

谢谢

更新:

  • 节点v10.14
  • Mongo v4.0.4
  • 猫鼬v5.3.13
  • Express v4.16.4

修改

我剥离了saveData函数,并将所有内容都内联到api.post函数中,仍然存在相同的问题。

现在代码如下:

api.post('/data', async (req, res) => {
    let data = req.body.data;

    if (data) {
        log.info('Saving data : ' + data.filePath);

        let x = await OtherData.findOneAndUpdate(...);
        //some processing...
        let newData = await Data.findByIdAndUpdate(data._id, data, {new: true, upsert: true});
        log.info('Finished saving data : ' + data.filePath);
        res.status(201).json(newData._id);
    }
    else
        res.status(400).end();
});

更新2

我完全删除了与猫鼬相关的代码-实际上,我只是在接收数据并返回一个“已接收”字符串,但内存仍然会增加。

可能与:https://github.com/expressjs/express/issues/3413

有关

0 个答案:

没有答案