2015-02-05 4 views
3

노드에서 파일 업로드를 처리하기 위해 multerformidable 두 개의 다른 라이브러리를 사용해 보았습니다. 둘 다 업로드 중에 100 % CPU를 사용합니다.NodeJS 업로드 파일 100 % cpu 사용량

일반적인 노드 문제입니까? 그리고 높은 동시성 환경에서 사람들이 그것을 어떻게 다루는가?

노드 버전 : v0.10.36

가공 할 예

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 예 (심지어 v0.11.x 또는 v0.10.33 같은 다른 버전을 시도했습니다)

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

내 문제는 메모리 사용량이 아닌 CPU와 관련되어 있으므로 관련이 있다고 생각하지 않습니다. 어쨌든 두 코드 스 니펫을 추가했습니다 –

+0

다음 코드를 사용해 볼 수 있습니까? fs.createReadStream (filePath) .pipe (fs.createWriteStream ('public/images /'+ filename)) .on ('close', function() { fs.unlink (filePath, function() { 콜백 (null, '/ images /'+ filename); }); }); 업로드 끝점에서 컨트롤러로 사용하십시오. –

답변

-1

높은 동시성 환경에서 작업으로 인해 CPU가 100 %에 도달하면 슬프게 노드 block이됩니다. 파일 업로드는 정적 자산을 제공하는 것과 같은 의미입니다. nodejs가 정적 컨텐츠를 제공하는 데 어떻게 적합하지 않은지에 대한 많은 논의가 있습니다. here 대신 nginx 또는 apache를 사용하십시오.

또 다른 해결책은 업로드를 작업자 프로세스 또는 대기열 시스템에 위임하는 것입니다. 예를 들어 ZMQ을 참조하십시오.

+0

사실이 아닙니다. CPU 사용률은 많은 것을 기반으로하며 업로드는 거의 모든 IO입니다. 100 % CPU가 항상 차단되지는 않습니다. 논리적으로 집중적 인 방법에서만. 실제로는 매우 완전한 이벤트 루프를 나타낼 수 있습니다.이 루프는 멀터가 스트림을 사용하기 때문에 의미가 있습니다. 업로드 대기열은 의미가 없으므로 요청을 ZMQ에 대기시킨 다음 클라이언트를 작업자에게 다시 연결할 수 없습니다. 이미 업로드 된 이미지는 이미지 처리와 같은 작업을 처리하기 위해 대기열에 있습니다. – tsturzl

+1

안녕하세요. 직접 답변 해주세요. 그것이 받아 들여지는지 보자. –

+0

내가 할 수있는 일이지만, 내가 무슨 일이 일어나고 있는지 정확히 알았다면 그렇게 할 수있을 것이다. 분명히 단순한 작업은 100 % CPU를 사용하지 않아야합니다. 내가 말한 바는, 만약 그렇다면, 이것이 직접적으로 차단을 의미하지는 않는다는 것입니다. 그 가능성이 저하 된 성능을 나타냅니다. – tsturzl