NodejsでError:EMFILE、too many open filesの解決策

1276 ワード

1.なぜEMFILE、too many open filesが現れますか?
ファイルシステムを大量に同時起動すると、オペレーティングシステムのファイル記述子の数が瞬時に光を使い、EMFILE、too many open filesを抛り出す.
非同期I/Oと同期I/Oの著しい差:同期I/Oは各I/Oが互いにふさがっているため、循環体の中で、いつも次から次へと呼出します.消耗ファイルの説明が多すぎることはなく、性能も低下します.
非同期I/Oについては、併発は容易に実現できるが、一定の過負荷保護を与え、底部システムの性能の過度な圧搾を防ぐ必要がある.
ソリューション
1.1 bagpipeソリューション
1つのキューによってマージ量を制御し、現在アクティブである場合(イニシャルを起動していますが、コールバックを実行していません)の異なるステップの使用量が制限値より小さい場合、キューから実行を取り出します.
アクティブコールが限定値に達したら、呼び出しは一時的にキューに保存されます.
各非同期呼び出しが終了すると、キューから新しい非同期呼び出しを取り出して実行します.
bagpipeのAPIは主に一つのプッシュ()方法と一つのフルイベントを暴露しています.例のコードは以下の通りです.
var Bagpipe = require('bagpipe');
//         10

var bagpipe = new Bagpipe(10);

for (var i=0; i<100; i++) {
    bagpipe.push(async, function () {
          //       
    });
}
bagpipe.on('full', function (length) {
    console.warn('    ,       :' + length);
});
1.2 asyncの解決策
parallel Limit()
parallel Limie()はパラレルタスクを動的に増やすことができず、asyncはこの需要を満たすためのスクウェア()方法を提供しています.これはファイルディレクトリを巡回するなどの操作に非常に効果的です.
http://blog.csdn.net/ctbinzi/article/details/39895401
1.3 ulimit-n 
This workd for me:
ulimit -n 10480
http://stackoverflow.com/questions/19981065/nodejs-error-emfile-too-many-open-files-on-mac-os