2012-01-13 6 views
1

できるだけ多くの要求を処理し、要求ごとに1つのファイルを書き込もうとしています。小さなペイロードは正常に動作しますが、同期バージョンが正常に動作している間は高負荷のシナリオでは、非同期バージョン(fs.writeFile)がハングします。ノードは要求の処理を停止し、ほとんどのファイルを0のサイズで残します(大部分は作成されません)。 Ubuntuの(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接続もファイルディスクリプタです)。ここではすべての接続で1つのファイルが作成され、500の並行性で1000のファイル記述子が作成されます。そしておそらくあなたのulimit -nは1024です。実際には、生産性の高い並行処理サーバーのためにやっていることが実際に限界を上げることができます。その横に並行性が500未満のキューを作ることができます。asyncモジュールを使って私のアプリケーションの1つでこれを行いました。私が行うすべての要求にキャップをかける。これは私が作っているファイル記述子を保持しますが、着信接続は保持しません。また、この方法はあり

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

関連する問題