在Linux中打开了太多文件(Too many open files)的解决方法

来源:岁月联盟 编辑:exp 时间:2012-02-21
回答一
 
文件系统允许打开的最大文件句柄数
 
1
[root@lxadmin nginx]# cat /proc/sys/fs/file-max
2
8192
每个进程能打开的最大文件句柄数
1
[root@lxadmin nginx]# ulimit -n
2
1024
 
可以在启动某个进程前,使用[root@lxadmin nginx]# ulimit -n 8192调整yixia
如果需要永久调整文件系统允许打开的文件句柄数 可在启动文件/etc/rc.d/rc.local(不适用于ubuntu)末尾添加ulimit -n x或在/etc/sysctl.conf末尾添加fs.file-max=xxx
 
回答二
 
Linux内核有时会报告“Too many open files”,起因是file-max默认值(如8096)太小。要解决这个问题,可以root身份执行下列命令
 
# echo "65536"  > /proc/sys/fs/file-max  # 适用于2.2和2.4版内核
# echo "131072" > /proc/sys/fs/inode-max # 仅适用于2.2版内核d
 
或将它们加入/etc/rcS.d/*下的init脚本。
 
回答三
 
办法是修改操作系统的打开文件数量限制,方法如下:
 
1.  在/etc/sysctl.conf末尾添加fs.file-max=xxx
 
2.  在/etc/security/limits.conf文件中设置每个进程能最大打开的文件句柄数:
 
1
* - nofile 8192

1
* hard nofile 8192
2
* soft nofile 8192
上述设置了每个用户每个进程的默认打开文件数为2048。 注意"nofile"项有两个软限制(soft)和硬限制(hard)之分。 要使修改过的最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定, 则hard和soft设定会同时被设定。 硬限制表明soft限制中所能设定的最大值。soft限制是当前系统生效的设置值。hard限制值可以被普通用户降低。但是不能增加。soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。 当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。
 
另外一种情况是在创建索引的时候,也有两种可能,一种是合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另一种是合并因子受虚拟机内存的限制,无法调整得更大,而需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。
 
在此基础上,我还修改了配置文件/etc/sysctl.conf ,  对TCP sockets进行了一些优化,例如:
01
# Decrease the time default value for tcp_fin_timeout connection
02
net.ipv4.tcp_fin_timeout = 30
03
# Decrease the time default value for tcp_keepalive_time connection
04
net.ipv4.tcp_keepalive_time = 1800
05
# Turn off tcp_window_scaling
06
net.ipv4.tcp_window_scaling = 0
07
# Turn off the tcp_sack
08
net.ipv4.tcp_sack = 0
09
#Turn off tcp_timestamps
10
net.ipv4.tcp_timestamps = 0
 注:一个socket连接也被看作一个文件