【2019-01-28】 too many open files(打開的文件過多)解決方法

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

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

[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那一行就代表系統(tǒng)目前允許單個進程打開的最大句柄數(shù),這里是1024。

使用命令lsof -p 進程id可以查看單個進程所有打開的文件詳情,使用命令lsof -p 進程id | wc -l可以統(tǒng)計進程打開了多少文件:

[tomcat@localhost bin]$ jps

3092 Bootstrap

3197 Jps

[tomcat@localhost bin]$ lsof -p 3092 | wc -l

108

以裸啟動的tomcat為例,可以看到它目前打開了108個文件數(shù),如果文件數(shù)過多使用lsof -p 進程id命令無法完全查看的話,可以使用lsof -p 進程id > openfiles.log將執(zhí)行結(jié)果內(nèi)容輸出到日志文件中查看。

二、解決方法

1、增大允許打開的文件數(shù)——命令方式

ulimit -n 2048

這樣就可以把當前用戶的最大允許打開文件數(shù)量設置為2048了,但這種設置方法在重啟后會還原為默認值。

ulimit -n命令非root用戶只能設置到4096。

想要設置到8192需要sudo權(quán)限或者root用戶。

2、增大允許打開的文件數(shù)——修改系統(tǒng)配置文件

vim /etc/security/limits.conf?

#在最后加入?

* soft nofile 4096?

* hard nofile 4096?

或者只加入

* - nofile 8192

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

roy soft nofile 8192?

roy hard nofile 8192?

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

3、檢查程序問題

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

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

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

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

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

如果程序中存在這些問題的話,無論系統(tǒng)句柄數(shù)設置的多么大,隨著時間的推移,也一定會占用完。

---------------------

作者:張小鳴

來源:CSDN

原文:https://blog.csdn.net/roy_70/article/details/78423880

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容