治標的辦法就是擴大檔案按描述符的限制
一、
[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