Утечка памяти при загрузке файла Node.js - PullRequest
0 голосов
/ 31 августа 2018

Я создаю API с Node.js и Express. Когда пользователь загружает файл, сервер изменяет его с помощью библиотеки обработки изображений sharp, а затем загружает его в корзину Google Cloud Storage. Использование ОЗУ процессом узла увеличивается на размер загружаемого файла и никогда не уменьшается, даже если выполняется сборка мусора вручную. Когда ОЗУ не осталось для выделения, сервер падает.

Вот воспроизведение проблемы:

index.js

const express = require('express')
const GCS = require('@google-cloud/storage')
const Multer = require('multer')
const sharp = require('sharp')

const upload = Multer({ storage: Multer.MemoryStorage, })

const storage = new GCS({
    projectId: 'myProject',
    keyFilename: './key.json'
}).bucket('myBucket')


const app = express();

app.get("/", (req, res) => {
    res.sendFile(__dirname + '/index.html')
})

app.post("/upload", upload.single('media'), (req, res) => {
    console.log(req.file)
    sharp(req.file.buffer).rotate().resize(1920, 1920).toBuffer().then(b => {
        const fileUpload = storage.file('test/' + Date.now())

        const fileStream = fileUpload.createWriteStream({
            metadata: {
                contentType: req.file.mimetype
            },
            resumable: false
        });

        fileStream.on('error', (err) => {
            console.log(err)
            res.send("Server Error")
        });

        fileStream.on('finish', () => {
            fileUpload.makePublic().then(() => {
                res.send("DONE")
            })
        })
        fileStream.end(b)
    }).catch(e => {
        console.log(e)
        res.send("Server Error")
    })
})

app.listen(3000, () => {
    console.log("Server is running...")
})

index.html

<form action="/upload" enctype="multipart/form-data" method="POST">
    <input type="file" name="media">
    <input type="submit">
</form>

Я также провел тест с использованием Multer.DiskStorage, и использование ОЗУ оставалось неизменным и почти не увеличивалось. Однако этот метод не является предпочтительным из-за дискового пространства, прав доступа к каталогу и т. Д.

Я ценю любую помощь, которую вы можете предложить!

1 Ответ

0 голосов
/ 31 августа 2018

Я бы посмотрел на предложения, представленные в предыдущих вопросах здесь и здесь - это не обязательно может быть результатом утечки памяти, и увеличение размера памяти класса экземпляра может решить проблему.

...