解決接口調用報錯newSocketStream(..)failed:Too?many?open?files問題
問題描述
在調用微服務接口時,出現(xiàn)報錯
newSocketStream(..) failed: Too many open files
具體錯誤信息如下:
原因分析
報錯字面意思是程序打開的文件數(shù)過多
程序打開的文件數(shù)過多,不過這里的files不單是文件的意思,也包括打開的通訊鏈接(比如socket),正在監(jiān)聽的端口等等,所以有時候也可以叫做句柄(handle),這個錯誤通常也可以叫做句柄數(shù)超出系統(tǒng)限制。
第一時間想到的是程序異常報錯,進程未正常結束或者請求次數(shù)異常增大,但是實際上這些情況并未發(fā)生。
接著只能求助于網(wǎng)上的大神,查詢問題,基本上都是說句柄數(shù)超出系統(tǒng)限制
解決方案
于是按照網(wǎng)上的解決方法操作:
- 先查看進程描述符
ulimit -a
- 查看當前系統(tǒng)打開的文件數(shù)量
lsof | wc -l
- 查看某一進程的打開文件數(shù)量
lsof -p pid | wc -l
- 增大允許打開的文件數(shù)
ulimit -n 1024000
增大允許打開的文件數(shù):
1.臨時(重啟后失效): ulimit -n 1024000(非root用戶限制到4096)
2.永久生效(需要重啟)vim /etc/security/limits.conf #在最后加入 * soft nofile 1024000 * hard nofile 1024000
在查看當前系統(tǒng)打開的文件數(shù)量,出現(xiàn)問題
出現(xiàn)這個問題的情況 ,一般有兩種:
- 系統(tǒng)中有容器在運行該進程
- 啟動進程后,刪除了相關進程的文件,導致進程異常
到這里我其實已經(jīng)發(fā)現(xiàn)問題似乎不是這個,再次查詢程序進程打開文件數(shù)量,發(fā)現(xiàn)只有5個,確定不是應用程序文件打開過多的問題。
網(wǎng)上查詢也實在沒有啥好的解決方法(重啟程序也試過了)
后面我查詢運行程序的時候,發(fā)現(xiàn)了用戶問題,有的是root啟動的,有的又是非root用戶
而報錯的程序就是root用戶啟動的,于是懷著試一試的心態(tài),將程序改為非root用戶啟動,結果接口訪問成功了?。。?!
總結
雖然問題解決了,但是我也是云里霧里的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
第一次使用Android Studio時你應該知道的一切配置(推薦)
這篇文章主要介紹了第一次使用Android Studio時你應該知道的一切配置(推薦) ,需要的朋友可以參考下2017-09-09Springboot中如何使用Redisson實現(xiàn)分布式鎖淺析
redisson是redis的java客戶端程序,國內外很多公司都有在用,下面這篇文章主要給大家介紹了關于Springboot中如何使用Redisson實現(xiàn)分布式鎖的相關資料,需要的朋友可以參考下2021-10-10JAVA spark創(chuàng)建DataFrame的方法
這篇文章主要介紹了JAVA spark創(chuàng)建DataFrame的方法,幫助大家更好的理解和學習spark,感興趣的朋友可以了解下2020-08-08java中同類對象之間的compareTo()和compare()方法對比分析
這篇文章主要介紹了java中同類對象之間的compareTo()和compare()方法對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09詳解如何在SpringBoot項目中使用統(tǒng)一返回結果
在一個完整的項目中,如果每一個控制器的方法都返回不同的結果,那么對項目的維護和擴展都會很麻煩。因此,本文為大家準備了SpringBoot項目中使用統(tǒng)一返回結果的方法,需要的可以參考一下2022-10-10