Too many open files問題解決

來源:互聯網
上載者:User

治標的辦法就是擴大檔案按描述符的限制

一、

[root@lxadmin nginx]# cat /proc/sys/fs/file-max
8192
檔案系統最大可開啟文
件數
[root@lxadmin nginx]# ulimit -n
1024
程式限制只能開啟1024個檔案
使用
[root@lxadmin nginx]# ulimit -n 8192調整一下
或者永久調整開啟檔案數
可在開機檔案/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)

ulimit -n 8192

二、

Linux核心有時會報告“Too many open
files”,起因是file-max預設值(8096)太小。要解決這個問題,可以root身份執行下列命令(或將它們加入/etc/rcS.d/*下
的init指令碼。)

# echo "65536"  > /proc/sys/fs/file-max  # 適用於2.2和2.4版核心
# echo
"131072" > /proc/sys/fs/inode-max # 僅適用於2.2版核心

三、

辦法是修改作業系統的開啟檔案數量限制,方法如下:

1. 按照最大開啟檔案數量的需求設定系統,
並且通過檢查/proc/sys/fs/file-max檔案來確認最大開啟檔案數已經被正確設定。

# cat
/proc/sys/fs/file-max
如果設定值太小, 修改檔案/etc/sysctl.conf的變數到合適的值。
這樣會在每次重啟之後生效。 如果設定值夠大,跳過下步。
# echo 2048 > /proc/sys/fs/file-max
編
輯檔案/etc/sysctl.conf,插入下行。
fs.file-max = 8192

2. 在/etc/security/limits.conf檔案中設定最大開啟檔案數
, 下面是一行提示:
#

添加如下這行。
* - nofile 8192

這行設定了每個使用者的預設開啟檔案數為2048。 注意"nofile"項有兩個可能的限制措施。就是項下的hard和soft。
要使修改過得最大開啟檔案數生效,必須對這兩種限制進行設定。 如果使用"-"字元設定, 則hard和soft設定會同時被設定。
硬限制表明
soft限制中所能設定的最大值。 soft限制指的是當前系統生效的設定值。 hard限制值可以被普通使用者降低。但是不能增加。
soft限制不能設定的比hard限制更高。 只有root使用者才能夠增加hard限制值。
當增加檔案限制描述,可以簡單的把當前值雙倍。
例子如下, 如果你要提高預設值1024, 最好提高到2048, 如果還要繼續增加, 就需要設定成4096。

另外一種情況是在建立索引的時候,也有兩種可能,一種是
合并因子太小,導致建立檔案數量超過作業系統限制,這時可以修改合并因子,也可以修改作業系統的開啟檔案數限制;另外一種是合并因子受虛擬機器記憶體的限制,
無法調整到更大,而 需要索引的doc 數量又非常的大,這個時候就只能通過修改作業系統的開啟檔案數限制來解決了。

在此基礎上,我還修改了以下一個設定檔
vi /etc/sysctl.conf
添加:
# Decrease the
time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout
= 30
# Decrease the time default value for tcp_keepalive_time
connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off
tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the
tcp_sack
net.ipv4.tcp_sack = 0
#Turn off tcp_timestamps
net.ipv4.tcp_timestamps
= 0
然後 service network restart,這些都和TCP sockets有關的最佳化。

另外需要在 /etc/rc.d/rc.local裡添加已使得重啟的時候生效。
echo
"30">/proc/sys/net/ipv4/tcp_fin_timeout
echo
"1800">/proc/sys/net/ipv4/tcp_keepalive_time
echo
"0">/proc/sys/net/ipv4/tcp_window_scaling
echo
"0">/proc/sys/net/ipv4/tcp_sack
echo
"0">/proc/sys/net/ipv4/tcp_timestamps
因為不是所有的程式都在root下跑的,所有linux有對
hard 與soft open files 的區分,普通使用者受hard的限制,無論ulimit -n $數值調到多高,都跑不到
/etc/security/limits.conf裡nofile的值.

這樣的最佳化後 lsof -p $java_pid|wc -l可以跑到4千以上都不會拋出too many open files。

 

治本就要檢查程式是否有沒關閉的流或連結。還有就是我在用tomcat+c3p0+mysql的時候會出現大量的CLOSE_WAITE也會導致檔案描述符耗盡,解決辦法可以看我關於這個問題的文章:http://blog.csdn.net/yuanyuan110_l/archive/2010/02/01/5276758.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.