敘述
錯誤信息
錯誤: Socket/File : too many open files(打開的文件過多)
從字面意思上看就是說程序打開的文件數過多,不過這裏的files不單是文件的意思,也包括打開的通訊鏈接(比如socket),正在監聽的端口等等,所以有時候也可以叫做句柄(handle),這個錯誤通常也可以叫做句柄數超出系統限制。
背景
引起的原因就是進程在某個時刻打開了超過系統限制的文件數量以及通訊鏈接數,通過命令ulimit -a可以查看當前系統設置的最大句柄數是多少:
查看當前系統打開的文件數量
代碼如下:
lsof | wc -l
watch "lsof | wc -l"
查看某一進程的打開文件數量
代碼如下:
lsof -p pid | wc -l
lsof -p 1234 | wc -l
解決方案
1.增大允許打開的文件數——命令方式
1.臨時(重啓後失效):
ulimit -n 4096(非root用戶限制到4096)
2.永久生效(需要重啓)
vim /etc/security/limits.conf
#在最後加入
* soft nofile 4096
* hard nofile 4096
2.檢查程序問題
如果你對你的程序有一定的解的話,應該對程序打開文件數(鏈接數)上限有一定的估算,如果感覺數字異常,請使用第一步的lsof -p 進程id > openfiles.log命令,獲得當前佔用句柄的全部詳情進行分析
1)打開的這些文件是不是都是必要的?
2)定位到打開這些文件的代碼
3)是否程序操作了文件寫入,但是沒有進行正常關閉
4)是否程序進行了通訊,但是沒有正常關閉(也就是沒有超時結束的機制)–(eg:post.releaseConnection()關閉連接)
代碼中只用post.releaseConnection()關閉連接,經過再網上查找資料,說這種關閉並沒有真正關閉連接,而是將該連接提交給 MultiThreadedHttpConnectionManager,等待複用。
Close_wate需要延遲幾秒鐘才能關閉連接,而每個Socket連接都需要等待幾秒鐘,壓力過大時,開啓的Socket連接超過了系統所能承受的最大連接數(ulimit -u 1024),所以拋出Too many open files異常。
小結
在寫代碼的時候規範,規範,規範。
感謝您的閱讀~~