linux檔案控制代碼數

2022-01-10 18:56:46 字數 2117 閱讀 8555

1問題闡述:

too many open files:顧名思義即開啟過多檔案數。

不過這裡的files不單是檔案的意思,也包括開啟的通訊鏈結(比如socket),正在監聽的埠等等,所以有時候也可以叫做控制代碼(handle),這個錯誤通常也可以叫做控制代碼數超出系統限制。

2、產生的原因:

經常在使用linux的時候出現,大多數情況是由於程式沒有正常關閉一些資源引起的,所以出現這種情況,請檢查io讀寫,socket通訊等是否正常關閉。

3、經典案例:

很多專案上線不久執行了一段時間後,服務突然宕了,經檢查日誌,出現了too many open files 錯誤。

4、解決方案:

前奏:其實linux是有檔案控制代碼限制的,而且預設不是很高,一般都是1024,作為一台生產伺服器,其實很容易就達到 這個數量,因此我們需要把這個值改大一些。我們可以用ulimit -n 來檢視當前使用者控制代碼數限制。那麼這個1024是系統的限制,還是使用者的限制呢。其實,這個是使用者限制來的,完整的說法,應該是當前使用者準備要執行的程式的限制。 

1、這個限制是針對單個程式的限制 

2、這個限制不會改變之前已經執行了的程式的限制 

3、對這個值的修改,退出了當前的shell就會消失 

因此出現這種問題有兩種解決方式:

第一:增大檔案控制代碼數。這種方式能及時解決問題,但是不能夠徹底的解決問題,可以為徹底解決問題提供一定的時間保證。那麼如何增大檔案控制代碼數數呢? 

如修改檔案控制代碼數為65535,ulimit -n 65535.此時系統的檔案控制代碼數為65535. 

2)將ulimit 值新增到/etc/profile檔案中(適用於有root許可權登入的系統) 

為了每次系統重新啟動時,都可以獲取更大的ulimit值,將ulimit 加入到/etc/profile 檔案底部。 

echo ulimit -n 65535 >>/etc/profile     

source /etc/profile    #載入修改後的profile  

ulimit -n     #顯示65535,修改完畢! 

到此為止,你以為大功告成了麼,其實不然,突然發現自己再次登入進來的時候,ulimit的值還是1024,這是為什麼呢? 使用者登入的時候執行sh指令碼的順序: 

/etc/profile.d/file 

/etc/profile 

/etc/bashrc 

/mingjie/.bashrc 

/mingjie/.bash_profile 

由於ulimit -n的指令碼命令載入在第二部分,使用者登入時由於許可權原因在第二步還不能完成ulimit的修改,所以ulimit的值還是系統預設的1024。所以想徹底改變這種問題,就必須做如下操作:修改/etc/security/limits.conf 

裡面有很詳細的注釋,比如 

* soft nofile 2048 

* hard nofile 32768 

就可以將檔案控制代碼限制統一改成軟2048,硬32768 

那麼什麼是軟限制,什麼是硬限制 

硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning 

這樣就實實際際的增大了檔案控制代碼數。

第二:分析控制代碼數,查詢原因,這是解決問題最根本的辦法。那麼如何分析那,就需要用到lsof這個命令了(關於這個命令大家可以在網上學習學習)。

(1)統計各程序開啟控制代碼數:lsof -n|awk ''|sort|uniq -c|sort -nr

(2)統計各使用者開啟控制代碼數:lsof -n|awk ''|sort|uniq -c|sort -nr

(3)統計各命令開啟控制代碼數:lsof -n|awk ''|sort|uniq -c|sort -nr

就掌商通來說,通過命令分析發現是乙個叫xmpp的東西開啟的連線數居多,佔到了單個程序總開啟連線數的百分之八十以上,再仔細分析,xmpp是訊息推送產生的連線,那麼到這裡問題比較明確了,接下來就是要分析為什麼訊息推送會開啟如此多的檔案控制代碼,且一直連著也不斷開。這樣問題就定位了。另外還有一些程序開啟檔案控制代碼數也比較多,這時你可以對比其他伺服器,看是否其他伺服器也是如此,以保證全面的解決問題。

Linux檔案控制代碼數配置

1 單程式控制程式碼數限制 檢視配置的控制代碼數 ulimit n cat etc security limits.conf soft nofile 655360 hard nofile 655360 2 全域性控制代碼數限制 cat proc sys fs file max 3 分析控制代碼數常用...

linux 檔案控制代碼數檢視命令

當你的伺服器在大併發達到極限時,就會報出 too many open files ulimit a 輸出如下 core file size blocks,c 0 data seg size kbytes,d unlimited scheduling priority e 0 file size bl...

修改linux最大檔案控制代碼數

大家知道在linux伺服器大併發調優時,往往需要預先調優linux引數,其中修改linux最大檔案控制代碼數是最常修改的引數之一。在linux中執行ulimit a 即可查詢linux相關的引數,如下所示 root mongodb11 ulimit a core file size blocks,c...