2015-02-05 3 views
3

Я пробовал две разные библиотеки: multer и formidable для обработки загрузки файлов в узел, и оба они используют 100% -ный процессор во время загрузки.NodeJS загружать файлы 100% использование процессора

Это проблема общего узла? И как люди справляются с этим в условиях высокой параллелизма?

Node версии: v0.10.36 (я даже попробовал другие варианты, как v0.11.x или v0.10.33)

Formidable например

Picture.upload = function(user, req, cb) { 
    var formidable = require('formidable') 

    var form = new formidable.IncomingForm(); 
    form.uploadDir = "./uploads"; 
    form.maxFieldsSize = app.settings.uploadMaxSize * 1024 * 1024; 
    form.maxFields = 1000; 

    form.parse(req, function(err, fields, files) { 
     cb(null, files); 
    }); 
} 

Multer пример

app.use(multer({ dest: './uploads/', 
    rename: function (fieldname, filename) { 
     return filename+Date.now(); 
    }, 
    limits: { 
     files: 1, 
     fileSize: app.settings.uploadMaxSize * 1024 * 1024 
    } 
})); // after I process the file from req.files 

Файл загружен как multipart/form-data.

Я использую loopback, но я не думаю, что это имеет значение.

+0

Можете ли вы опубликовать пример кода? Просто дикая догадка, может быть, это относится к https://github.com/felixge/node-formidable/issues/109? –

+0

Я не думаю, что это связано, потому что моя проблема связана с процессором не с использованием памяти. В любом случае, я добавил два фрагмента кода –

+0

вы можете попробовать следующий код? 'fs.createReadStream (filePath) .pipe (f public/images/'+ filename) .on (' close ', function() { fs.unlink (filePath, function() { callback (null, '/ images /' + filename); }); }); 'использовать это как контроллер в конечной точке загрузки. –

ответ

-1

В среде с высоким уровнем параллелизма, если задача заставляет процессор достичь 100% грубого узла, будет block. Я предполагаю, что загрузка файла означает то же, что и статические активы. Существует много дискуссий here о том, как nodejs не подходит для обслуживания статического контента. Вместо этого используйте nginx или apache.

Другим решением является делегирование загрузки в рабочий процесс или систему очередей. См. Например, ZMQ.

+0

Это неправда. Использование процентного процента процессора основано на многих вещах, а загрузка - почти все IO. 100% процессор не всегда будет блокироваться. Только по логически интенсивным методам. Это может фактически представлять собой очень полный цикл событий, что имеет смысл, потому что multer использует потоки. Загрузка очереди не имеет смысла, вы не можете просто поставить очередь на запрос в ZMQ, а затем снова подключить клиента к рабочему. Люди заказывают вещи, которые уже загружены, чтобы обрабатывать их, например манипуляции с изображениями. – tsturzl

+1

Эй, вы можете сделать свой собственный ответ. Посмотрите, получится ли это. –

+0

Я полагаю, что мог бы, но я бы сделал это, если бы у меня было хорошее представление о том, что происходит. Хотя, очевидно, простая задача не должна использовать 100% ЦП. Я говорил, что если это так, это не указывает на блокировку. Хотя, скорее всего, это ухудшение производительности. – tsturzl

Смежные вопросы