2012-06-29 73 views
2

我正在以下非常討厭的錯誤:快遞錯誤:EMFILE,打開的文件太多

Error: EMFILE, too many open files '/home/savagegames.net/views/index.jade' 
at Object.openSync (fs.js:240:18) 
at Object.readFileSync (fs.js:128:15) 
at View.contents (/home/savagegames.net/node_modules/express/lib/view/view.js:121:13) 
at Function.compile (/home/savagegames.net/node_modules/express/lib/view.js:68:45) 
at ServerResponse._render (/home/savagegames.net/node_modules/express/lib/view.js:417:18) 
at ServerResponse.<anonymous> (/home/savagegames.net/node_modules/express/lib/view.js:318:17) 
at /home/savagegames.net/node_modules/express-mongoose/index.js:45:21 
at resolve (/home/savagegames.net/node_modules/express-mongoose/index.js:75:12) 
at ServerResponse.expressmongoose [as render] (/home/savagegames.net/node_modules/express-mongoose/index.js:37:12) 
at /home/savagegames.net/controllers/index_controller.coffee:49:18 

我相信這是快遞的問題;我該如何補救?謝謝。

+1

通過與啓動應用程序相同的方式運行'ulimit -n',結果如何?也許這個限制太低了,需要提高。 (請聯繫您的管理員。)應用程序中可能存在錯誤,並且不會關閉不再需要的文件。檢查'/ proc/pid/fd /'目錄以查看該進程已打開的文件 - 這可能會幫助您發現問題。 – sarnold

+0

ulimit -n是'1024'。我查看了我的'/ proc/pid/fd',並發現了一大堆'lrwx ------ 1 root root 64 Jun 29 03:49 276 - > socket:[619284773]'。這些從哪裏來? –

+0

這些套接字可能是TCP/IP連接;檢查'netstat -anp | grep pid'來找出關於這些連接的更多細節。 (他們也可以是Unix域套接字;如果是這樣,'lsof'會更有用。) – sarnold

回答

1

從我發現的情況來看,發生錯誤時會發生,並且某些文件未關閉(當然,這是一個錯誤)。在我的情況下,node-postgres錯誤導致(奇蹟般)耗盡可用的描述符。當我刪除導致db錯誤的代碼時,EMFILE消失。

我想它可以在node.js代碼中修復 - 它應該在垃圾收集時關閉文件對象。儘管可能發生這些丟失的文件描述符仍然被別的東西鎖住。

1

我通過大量的資源去了,但相關答案是明確的docs:

app.enable('view cache') 

這真的幫助了很多,尤其是大量的緩存命中的解釋,它不會打開該文件在所有。

相關問題