解決Too many open files問題

2021-09-26 15:05:04 字數 2739 閱讀 2274

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

maxmemory

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

這樣就可以把當前使用者的最大允許開啟檔案數量設定為2048了,但這種設定方法在重啟後會還原為預設值

ulimit -n命令非root使用者只能設定到4096。

想要設定到8192需要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命令,獲得當前占用控制代碼的全部詳情進行分析,

1)開啟的這些檔案是不是都是必要的?

2)定位到開啟這些檔案的**

3)是否程式操作了檔案寫入,但是沒有進行正常關閉

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

如果程式中存在這些問題的話,無論系統控制代碼數設定的多麼大,隨著時間的推移,也一定會占用完。

解決 SVN解決衝突

intelij idea 使用svn,提交 前先更新 此時如果有衝突,就會提示你解決衝突。產生衝突的情況 a 和 b 兩名程式設計師,分別更新了同一版本 version 1 的 同時修改了乙個檔案。a提交 後,伺服器中的 是 version a 即 a 修改後的 b隨後提交 由於伺服器中的 已經不是...

svn is already locked解決方案

蛋疼的問題,不是一次遇到了,每次遇到的原因都不一樣,從網上摘錄了一些資料,整理成文,svn是個不錯的東東。svn already locked 解決辦法 在出錯資料夾下,滑鼠右鍵tortoisesvn clean up.svn錯誤 attempted to lock an already locke...

Bad for loop variable解決方法

錯誤為syntax error bad for loop variable 解決辦法 sudo dpkg reconfigure dash 在選擇項中選no 從 ubuntu 6.10 開始,ubuntu 就將先前預設的bash shell 更換成了dash shell 其表現為 bin sh 鏈結...