1. 程式人生 > >錯誤異常too many open files解決方法

錯誤異常too many open files解決方法

一、產生原因
too many open files是Linux系統中常見的錯誤,從字面意思上看就是說程式開啟的檔案數過多,不過這裡的files不單是檔案的意思,也包括開啟的通訊連結(比如socket),正在監聽的埠等等,所以有時候也可以叫做控制代碼(handle),這個錯誤通常也可以叫做控制代碼數超出系統限制。 
引起的原因就是程序在某個時刻打開了超過系統限制的檔案數量以及通訊連結數,通過命令ulimit -a可以檢視當前系統設定的最大控制代碼數是多少:


open files那一行就代表系統目前允許單個程序開啟的最大控制代碼數,這裡是1024。 
使用命令lsof -p 程序id

可以檢視單個程序所有開啟的檔案詳情,使用命令lsof -p 程序id | wc -l可以統計程序打開了多少檔案,如果檔案數過多使用lsof -p 程序id命令無法完全檢視的話,可以使用lsof -p 程序id > openfiles.log將執行結果內容輸出到日誌檔案中檢視。

二、解決方法
1、增大允許開啟的檔案數——命令方式
ulimit -n 2048
這樣就可以把當前使用者的最大允許開啟檔案數量設定為2048了,但這種設定方法在重啟後會還原為預設值。 
ulimit -n命令非root使用者只能設定到4096。 
想要設定到更大需要sudo許可權或者root使用者。

2、增大允許開啟的檔案數——修改系統配置檔案
vim /etc/security/limits.conf  
#在最後加入  
* soft nofile 4096  
* hard nofile 4096  

或者只加入

 * - nofile 8192

最前的 * 表示所有使用者,可根據需要設定某一使用者,例如

roy soft nofile 8192  
roy hard nofile 8192  

注意”nofile”項有兩個可能的限制措施。就是項下的hard和soft。 要使修改過得最大開啟檔案數生效,必須對這兩種限制進行設定。 如果使用”-“字元設定, 則hard和soft設定會同時被設定。

3、檢查程式問題
如果你對你的程式有一定的解的話,應該對程式開啟檔案數(連結數)上限有一定的估算,如果感覺數字異常,請使用第一步的lsof -p 程序id > openfiles.log命令,獲得當前佔用控制代碼的全部詳情進行分析