2011-03-08 52 views
5

我收到以下錯誤只在我的Ubuntu Rackspace公司特立獨行的實例......但不能在我的本地Ubuntu的清醒VM:打開的文件太多使用child_process

pipe(): Too many open files 
pipe(): Too many open files 

child_process.js:223 
    var fds = this._internal.spawn(path, 
         ^
Error: Error spawning 
    at ChildProcess.spawn (child_process.js:223:28) 
    at child_process.js:10:15 
    etc..etc.. 

產生它的代碼:

function getHeader(url, callback) 
{ 
    var client = spawn('curl', ['-I', url]); 
    client.stdout.on('data', function(data) 
    { 
    client.kill('SIGTERM'); 
    callback(data.toString('utf8')); 
    }); 
} 
+1

不知道你可以做些什麼來修復它,但打開文件的數量是操作系統的一個可配置部分,這就是爲什麼它在本地正常工作並在服務器上中斷。 – 2011-03-08 04:17:30

回答

3

知道您的託管服務提供商設置了文件限制有多低會有所幫助:ulimit -n會告訴您什麼setrlimits(2)限制在每個進程的打開文件描述符的數量上。典型安裝使用1024。他們可能會將它設置得低得多以限制內核內存的使用。

有嚴格的限制,只能通過禮貌地詢問Rackspace(除非您有對例如/etc/security/limits.conf的寫入訪問權限)和軟限制(可以提高到硬性限制)才能提出限制。他們可能會設定較低的軟限制,以儘量減少資源使用,但保持較高的硬限。

知道有多少個文件描述符node當前正在使用也是有幫助的。在您登錄時,請檢查/proc/$(pidof node.js)/fd/以查看打開了多少個文件。也許你沒有儘快關閉文件或套接字或管道?

+0

'Rackspace盒子和我的虛擬機上'ulimit -n'都是1024 ... – mkrecny 2011-03-08 14:50:22

+0

'/ etc/security/limits.conf'的內容在兩個實例上都是相同的。 – mkrecny 2011-03-08 14:59:07