2011-06-26 18 views
7

Node.JS için yeni ve bir EMFILE hatası ile sıkışmış durumdayım. EMFILE istisnasını yakalamanın ve onu kod içinde işlemenin bir yolunun peşindeyim.Nasıl ulemit değiştirmeden nodejs EMFILE istisnası ele alınır?

"Hata: EMFILE, Çok fazla açık dosya" hatasıyla ilgili birçok soru var gibi görünüyor, ancak yanıtların çoğu "ulimitinizi artırın" satırları boyunca görünüyor.

İlk sorum şu, bu özel durumu nasıl yakalarım?

stream = net.createConnection(port, host); 

    stream.addListener('connect', function() { 
    return stream.write(request); 
    }); 
    stream.addListener('data', function(data) { 
    return console.log(data); 
    }); 
    stream.addListener('end', function() { 
    stream.end(); 
    return callback(); 
    }); 
    stream.addListener('timeout', function() { 
    stream.destroy(); 
    console.log("timeout"); 
    return callback(); 
    }); 
    stream.addListener('error', function(e) { 
    console.log("this never gets called"); 
    return 
    }); 

istisna 'hatası' dinleyici yakalanmış olmanın değildir: Ben birçok bağlantıları ile aşağıdaki kodu çalıştırdığınızda, EMFILE hata yükseltir. Yukarıdakileri try{} catch (e) {}'da paketlemeye çalıştım ve hiçbir şey olmuyor. CreateConnection için geri arama yöntemi kullandım ve herhangi bir hata döndürmüyor. her şeyi yakalamak olduğu göz önünde bulundurulursa güvensiz görünüyor

process.on('uncaughtException', function(err) { 
    console.log(err); 
}); 

:

Ben durum yakalamak mümkün olmuştur tek yolu

beraberdir.

Ve ikinci sorum şu: Hatayı yakalamak ve aramayı yeniden denemek için "en iyi yöntemler" yolu nedir?

ben baktım: https://github.com/isaacs/npm/blob/master/lib/utils/graceful-fs.js ve referanslar olarak Simple nodejs http proxy fails with "too many open files" ama createConnection çağrısına NPM gelen zarif yöntemini nasıl uygulanacağını emin değilim.

Çok teşekkürler! Bu istisnayı yakalasanız bile, bu konuda yapabileceğiniz faydalı bir şey var mı?

cevap

3

Eğer bir yerde bir sızıntınız varsa, sızıntıyı düzeltmeniz gerekir ve eğer normal ancak çok yüksek bir yükünüz varsa, bunu bir şekilde halletmeniz gerekir. Her iki durumda da, bu duruma geldiğinizde, düğüm sürecinizde işler oldukça kötüdür.

Ne yazık ki, bir uncaughtException olayını ele aldığınızda, yapılacak tek güvenli işlem hata mesajını günlüğe kaydedip işlemden çıkar. İstisnanın atıldığı yığın artık gitti ve derin bir iç karışıklık yakında sonuçlanacak.

En iyi çözüm, işlem için kullanılabilir dosya tanıtıcılarının sayısını artırmaktır. İyi haber şu ki dosya tanıtıcıları gerçekten çok ucuz.

+0

Bu tür bir uygulama istisnasını ele almanın en iyi yolunu öğrenmenin bir aracı olarak istisnai durumları yakalamak istedim. Özellikle uygulama için, bir sonraki bağlantı ile bir dizi oluşturmayı bitirdim - bir bağlantı bittiğinde, diziden bir sonrakini çekti. – Moolio

+2

işlem için kullanılabilir dosya tanımlayıcıların sayısını artırmak için, OSX – DTrejo

+1

üzerinde 'ulimit -S -n 5000' çalıştırın, bu tür bir özel durumla başa çıkmak için en iyi yolun nedeni hata ayıklamak olduğunu söyleyebilirim. EMFILE (temelde dosyadaki bir dosya tanımlayıcısı sızıntısı), düzgün bir şekilde işlevsel kod içinde ortaya çıkması gereken bir istisna değildir (kodunuz gerçekten çok sayıda dosya açmıyorsa). Ben, '' try'/'catch' stratejilerini denemeden önce, nerede, nasıl ve neden sızıntının meydana geldiğini ayıklamak için' lsof' kullanmanızı öneririm. –

İlgili konular