Too many open files解決方法

問題

早上到公司發現負責的一個項目打不開了,因為其他項目都依賴於這個模塊,所有導致所有項目都無法運行。趕緊排查問題。

首先看了日誌,發現報錯信息為Too many open files

Too many open files解決方法

然後查看ulimit命令查看文件配置,如下

Too many open files解決方法

這裡發現默認每個進程打開的文件最大個數是1024。

接著我取項目的進程id查看項目打開文件數目,如下

Too many open files解決方法


發現一共打開了4137個文件資源,超出默認的1024很多。

接著使用lsof -p #port命令查看項目究竟都開了哪些資源文件,如下圖所示:

Too many open files解決方法

發現大部分是我一個項目中使用的取IP地址文件,我懷疑是不是沒有釋放文件IO連接資源所導致的。一看代碼,果然是,馬上修改,如下:

Too many open files解決方法

寫代碼還是要小心呀,特別是對資源的操作。

原因

Too many open files是Linux系統中常見的錯誤,從字面意思上看就是說程序打開的文件數過多,不過這裡的files不單是文件的意思,也包括打開的通訊鏈接(比如socket),正在監聽的端口等等,所以有時候也可以叫做句柄(handle),這個錯誤通常也可以叫做句柄數超出系統限制。

引起的原因就是進程在某個時刻打開了超過系統限制的文件數量以及通訊鏈接數,通過命令ulimit -a可以查看當前系統設置的最大句柄數是多少:


Too many open files解決方法

open files那一行就代表系統目前允許單個進程打開的最大句柄數,這裡是1024。
使用命令lsof -p 進程id可以查看單個進程所有打開的文件詳情,使用命令lsof -p 進程id | wc -l可以統計進程打開了多少文件:


Too many open files解決方法

如果文件數過多使用

lsof -p 進程id命令無法完全查看的話,可以使用lsof -p 進程id > openfiles.log將執行結果內容輸出到日誌文件中查看。

解決辦法

1、增大允許打開的文件數

命令方式:ulimit -n 2048

這樣就可以把當前用戶的最大允許打開文件數量設置為2048了,但這種設置方法在重啟後會還原為默認值ulimit -n命令非root用戶只能設置到4096。 想要設置到8192需要sudo權限或者root用戶。


修改系統配置文件

<code>vim /etc/security/limits.conf  
#在最後加入
* soft nofile 4096
* hard nofile 4096
1234/<code>

或者只加入

<code> * - nofile 8192
/<code>

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

<code>roy soft nofile 8192  
roy hard nofile 8192 /<code>

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

2、檢查程序問題

如果你對你的程序有一定的解的話,應該對程序打開文件數(鏈接數)上限有一定的估算,如果感覺數字異常,請使用第一步的lsof -p 進程id > openfiles.log命令,獲得當前佔用句柄的全部詳情進行分析,

打開的這些文件是不是都是必要的?

定位到打開這些文件的代碼

是否程序操作了文件寫入,但是沒有進行正常關閉

是否程序進行了通訊,但是沒有正常關閉(也就是沒有超時結束的機制)

如果程序中存在這些問題的話,無論系統句柄數設置的多麼大,隨著時間的推移,也一定會佔用完。


分享到:


相關文章: