Экспресс утечка памяти - PullRequest
       23

Экспресс утечка памяти

0 голосов
/ 04 декабря 2018

Дополнительный код + информация по адресу: https://github.com/expressjs/express/issues/3817

У меня есть система, которая анализирует некоторые данные из файлов, а затем отправляет их в Express API через POST.

Размерданные меньше 1 МБ.

Я посылаю около 7 запросов в секунду (7 файлов в секунду) на мой API, вот код 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
  • Mongoosev5.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

Я полностью удалилсвязанный с mongoose код - я буквально просто получаю данные и возвращаю строку «получены», но память все равно увеличивается.

Может быть связано с: https://github.com/expressjs/express/issues/3413

...