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

回答一

文件系统允许打开的最大文件句柄数

[root@lxadmin nginx]# cat /proc/sys/fs/file-max
8192


每个进程能打开的最大文件句柄数
[root@lxadmin nginx]# ulimit -n
1024



可以在启动某个进程前,使用[root@lxadmin nginx]# ulimit -n 8192调整一下
如果需要永久调整文件系统允许打开的文件句柄数, 在/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文件中设置每个进程能最大打开的文件句柄数 : 

* - nofile 8192


* hard nofile 8192
* soft nofile 8192


上述设置了每个用户每个进程的默认打开文件数为8192。 注意"nofile"项有两个软限制(soft)和硬限制(hard)之分。 要使修改过的最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定, 则hard和soft设定会同时被设定。 硬限制表明soft限制中所能设定的最大值。 soft限制是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。 当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

另外一种情况是在创建索引的时候,也有两种可能,一种是合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另一种是合并因子受虚拟机内存的限制,无法调整得更大,而需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。

在此基础上,我还修改了配置文件/etc/sysctl.conf ,  对TCP sockets进行了一些优化,例如:
# 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


 注:一个socket连接也被看作一个文件
 
 

你可能感兴趣的:(linux,ulimit,open,Files,too,many)