2012-01-13 2 views
1

가능한 한 많은 요청을 처리하고 요청 당 하나의 파일을 작성하려고합니다. 작은 페이로드가 정상적으로 작동하지만 동기 버전이 정상적으로 작동하는 동안 높은 페이로드 시나리오에서 비동기 버전 (fs.writeFile)이 중지됩니다. 노드는 요청 처리를 중단하고 대부분의 파일을 0 크기로 남겨 둡니다 (대부분 생성되지 않습니다). 우분투 (VM) 및 Mac OSX에서높은로드에서 fs.writeFile이 응답하지 않음 (v.0.6.6에서 오류 없음)

{ stack: [Getter/Setter], 
arguments: undefined, 
type: undefined, 
message: 'EMFILE, Too many open files \'aw_1031\'', 
errno: 24, 
code: 'EMFILE', 
path: 'aw_1031' } 

같은 동작 :

우리가 가진 v.0.4.7에서 v0.6.6

에 오류가 없습니다.

이것은 우리가 현재 실행하고있는 예제 스크립트입니다 :

ab -n 30000 -c 500 http://HOST:8000/ 

filetest.js는

var http = require('http'); 
var fs = require('fs'); 
var util = require ('util'); 
var i=0; 

function writeALot(req, res){ 
    fs.writeFile("filetest"+i, "Just a try: "+i, 
     function(err){ 
      if(err) console.log(util.inspect(err)); 
     }); 
    i++; 
    res.writeHead(200); 
    res.end(); 
} 
http.createServer(writeALot).listen(8000); 

우리는 어떻게 동시 FD의 최대 수를 관리 할 수 ​​있습니까? 어떤 충고?

미리 감사드립니다.

답변

1

파일 설명자의 수는 제한되어 있습니다 (http 연결도 파일 설명자 임). 여기에 모든 연결에서 하나의 파일이 쓰여질 것입니다. 500 개의 동시 처리에서 1000 개의 파일 설명자가됩니다. 아마도 ulimit -n은 1024입니다. 생산 동시성이 높은 서버의 경우 실제로 한도를 높일 수 있습니다. 그 옆에 당신은 동시성이 500보다 작은 대기열을 만들 수 있습니다. async 모듈을 사용하는 내 응용 프로그램 중 하나에서이 작업을 수행했습니다. 내가하는 모든 요청에 ​​모자를 씌우고. 이렇게하면 들어오는 연결이 아니라 파일 설명자를 보유하게됩니다. 이 방법이

queue.push({ 
    method : 'file', // or request 
    task : 'something' 
}); 

나중에 그런

var queue = async.queue(function(task, cb) { 
    console.log('processing', task.method, queue.length(), task.addr) 
    if(task.method === 'file') { 
     makeFileStream(task); 
    } else { 
     makeRequest(task); 
    } 
}, 500); 

, 내가 요청을하거나 파일을 열려면 : http://nodebits.org/distilled-patterns

그러나 일괄 처리의 예는 좋은하지 않습니다 대기열을 사용합니다.

+0

고마워, 지금은 노드 v0.6.6에서 알려진 버그입니다 (중단 및 오류 없음). 하지만 그건 내 잘못이야 :) 노드 마술 기대합니다. 우리는 자원에 대해 더 많은주의를 기울일 것입니다. – Perrolobo

관련 문제