2021-05-12 14:32:11
Too many open files 問題解決方法
1.解決辦法
(1)檢視
檢視當前系統開啟的檔案數量
lsof | wc -l
watch "lsof | wc -l"
檢視某一進程的開啟檔案數量
lsof -p pid | wc -l
lsof -p 1234 | wc -l
該問題最大的可能是開啟的檔案或是socket沒有正常關閉。為了定位問題是否由Java進程引起,通過Java進程號檢視當前進程佔用檔案描述符情況:
lsof -p $java_pid # 每個檔案描述符的具體屬性
lsof -p $java_pid | wc -l # 當前Java進程file descriptor table中FD的總量
排序檢視當前進程開啟了多少控制代碼數
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
(2)系統級
系統級設定對所有使用者有效。可通過以下方式檢視系統最大檔案限制
- cat /proc/sys/fs/file-max # file-max是設定系統所有進程一共可以開啟的檔案數量。
- sysctl -a # 檢視結果中fs.file-max這項的設定數量
- /etc/security/limits.conf
- * soft noproc 102400
- * hard noproc 102400
- * soft nofile 102400
- * hard nofile 102400
- 注意:* 表示所有使用者,可根據需要設定某一使用者
- vim /proc/19800/limits # 檢視某個進程允許的引數
(3)使用者級
Linux限制每個登入使用者的可連線檔案數。可通過ulimit -n來檢視當前有效設定。如果想修改這個值就使用 ulimit -n <setting number> 命令。
對於檔案描述符增加的比例,資料推薦是以2的冪次為參考。如當前檔案描述符數量是1024,可增加到2048,如果不夠,可設定到4096,依此類推。
2.檔案控制代碼是用來幹嘛的?
控制代碼是表示你的進程與外界的i/o連線,檔案控制代碼是一個十六位長度的二進位制程式碼(Windows95後為32位元無符號整數),代表一個已被開啟檔案的通道號,借助於這個控制代碼,你的應用程式即可使用這個相應的控制代碼對檔案進行隨意存取操作,說白了檔案控制代碼其實是一串代表著特殊含義的號碼; 當然其實系統是用控制代碼與一些資源聯絡起來的,當由系統管理,動態分配給你應用程式的某些資源的代號,你就可以使用控制代碼存取相應的資源了,尤其在Windows系統中,有很多東東都使用控制代碼,如視窗,socket。
簡單看來程式通過控制代碼獲得資源的參照,來進行資源的開啟和關閉的操作。
3.為什麼會出現檔案控制代碼耗盡的情況?
主要是因為linux在檔案控制代碼的數目上有兩個級別的限制。一個是系統級別的總數限制,一個是針對使用者的限制。預設情況下每個使用者所能使用的控制代碼數是1024。一般情況下1024也夠用了,但是在大容量的系統上,特別是會頻繁使用網路通訊和檔案IO的系統上,1024很快就被耗光了。所以首先我們要調整這個值。
相關文章