2013-04-24 2 views
2

오늘 NodeJs에서 async/sync I/O 메소드를 사용하는 예제를 구현하려고 시도했지만 이상한 문제에 직면했습니다. 내가 ab로 요청을 보내려고 할 때, 나는 비동기 방식이 오류가 발생합니다 :비동기 파일 읽기에서 EMFILE 오류가 발생했습니다.

{ [Error: EMFILE, open 'sample.txt'] errno: 20, code: 'EMFILE', path: 'sample.txt' } 

그러나 동기화 모드에서 동일한 기능이 오류없이 잘 작동합니다.

테스트 실행에 대한 내 ab 명령이 있습니다 :

비동기 :

http.createServer(function (req, res) { 
    fs.readFile('sample.txt', function (err, data) { 
    if(err) { 
     res.writeHead(500, {'Content-Type': 'text/plain'}); 
     res.end(); 
     console.log(err); 
    } else { 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end(data); 
    } 
    }); 
}).listen(8080, '127.0.0.1'); 

동기화 : 여기

ab -n 10000 -c 1000 -vhr http://localhost:8080/ 

내 모두 코드입니다

http.createServer(function (req, res) { 
    var fileOutput = fs.readFileSync('sample.txt').toString(); 
    if(!fileOutput) { 
     res.writeHead(500, {'Content-Type': 'text/plain'}); 
     res.end('Error in reading the file.'); 
    } else { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end(fileOutput); 
    } 
}).listen(8081, '127.0.0.1'); 

무엇이 문제입니까? 비동기 메서드 사용에 문제가 있습니까? 모두

답변

3

다음을 수행 :

1 - 파일 열기. 2 - 파일을 읽습니다. 3 - 파일을 닫습니다. 4 - 응답을 보냅니다.

그러나 동기화 할 때 항상 다음을 수행합니다. (1-2-3) 한 문장으로. 그것들은 원자이다. 파일을 보내기 전에 많은 파일을 열어 놓고 있지만 파일을 열어 닫을 수 있습니다. 그러나 비동기에서는 원자가되지 않으며 주어진 시간에 hapening 할 수 있습니다. 따라서 비동기에서는 요청을 수신하고 파일을 열 가능성이 더 높습니다. 그러나 &을 보내기 전에 사실 더 많은 파일을 열었습니다. 곧 비동기식으로 열기 - 열기 - 열기 - 열기 - 열기 - 열기 - 닫기 - 열기 - 보내기 - 열기 (이 이벤트 순서는 도착 시간에 따라 달라집니다. 데이터 및 디스크 읽기 속도).

+0

좋아, 좋은 해결책이 될 것입니다. fs.readFile을 사용할 때 어떻게 링크를 닫을 수 있습니까? –

+0

연결할 수를 제한하거나 사용중인 시스템의 열린 파일 제한을 늘려야 할 수 없습니다. – Mustafa

관련 문제