too many open files(打開的文件過多)解決方法

too many open files(打開的文件過多)是Linux系統中常見的錯誤,從字面意思上看就是說程序打開的文件數過多,不過這裏的files不單是文件的意思,也包括打開的通訊鏈接(比如socket),正在監聽的端口等等,所以有時候也可以叫做句柄(handle),這個錯誤通常也可以叫做句柄數超出系統限制。 
引起的原因就是進程在某個時刻打開了超過系統限制的文件數量以及通訊鏈接數,通過命令ulimit -a可以查看當前系統設置的最大句柄數是多少:

[tomcat@localhost bin]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14732
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
open files那一行就代表系統目前允許單個進程打開的最大句柄數,這裏是1024。 
使用命令lsof -p 進程id可以查看單個進程所有打開的文件詳情,使用命令lsof -p 進程id | wc -l可以統計進程打開了多少文件:

[tomcat@localhost bin]$ jps
3092 Bootstrap
3197 Jps
[tomcat@localhost bin]$ lsof -p 3092 | wc -l
108
以裸啓動的tomcat爲例,可以看到它目前打開了108個文件數,如果文件數過多使用lsof -p 進程id命令無法完全查看的話,可以使用lsof -p 進程id > openfiles.log將執行結果內容輸出到日誌文件中查看。

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

2、增大允許打開的文件數——修改系統配置文件
vim /etc/security/limits.conf  
#在最後加入  
* soft nofile 4096  
* hard nofile 4096  
或者只加入

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

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

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

1)打開的這些文件是不是都是必要的?
2)定位到打開這些文件的代碼
3)是否程序操作了文件寫入,但是沒有進行正常關閉
4)是否程序進行了通訊,但是沒有正常關閉(也就是沒有超時結束的機制)
如果程序中存在這些問題的話,無論系統句柄數設置的多麼大,隨着時間的推移,也一定會佔用完。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章