Linux 打开文件数1024限制的原理以及解决办法

/proc/sys/fs/file-max 

该文件指定了可以分配的文件句柄的最大数目。

查看最大值:

[root@localhost home]# cat /proc/sys/fs/file-max 
100977
[root@localhost home]#

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)100977个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。这个参数的默认值是跟内存大小有关系的,增加物理内存以后重启机器,这个值会增大。大约1G内存10万个句柄的线性关系。

修改值:

如果用户得到的错误消息声明,类似”too many open files”,这是由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。

[root@localhost home]# vim /etc/rc.local 

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don‘t
# want to do the full Sys V style init stuff.
echo 222158 > /proc/sys/fs/file-max    ;添加此项,修改file-max值
touch /var/lock/subsys/local
[root@localhost home]# reboot
[root@localhost ~]# cat /proc/sys/fs/file-max 
222158
[root@localhost ~]#

修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 22158 > /proc/sys/fs/file-max
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为22158。修改完后保存此文件。

/proc/sys/fs/file-nr 

该文件与 file-max 相关,它有三个值: 
已分配文件句柄的数目     已使用文件句柄的数目     文件句柄的最大数目 
该文件是只读的,仅用于显示信息。

[root@localhost ~]# cat /proc/sys/fs/file-nr 
2112	0	222158
[root@localhost ~]#

/etc/security/limits.conf

limits.conf的格式如下:  

<domain>      <type>  <item>         <value>

<domain> :可以指定单个用户名、@组名、所有用户(*)

type:有 soft(指的是当前系统生效的设置值),hard(表明系统中所能设定的最大值)和 -(表明同时设置了 soft 和 hard 的值)

[root@localhost ~]# vim /etc/security/limits.conf   ;文末添加以下两项
* hard nofile 4096      
* soft nofile 4096
:wq

我的是RedHat5.4修改后需要重新登陆,有的系统可能需要重启生效,

使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中是否有以下选项:

[root@localhost ~]# cat /etc/pam.d/login |grep "pam_limits.so"
session required /lib/security/pam_limits.so
[root@localhost ~]#

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。


linux下面部署应用的时候,有时候会遇上socket/file: can‘t open so many files的问题,其实linux是有文件句柄限制的(就像winxp?),而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到这个数量,因此我们需要修改上述文件把这个值改大一些。

[root@localhost ~]# cat /proc/sys/fs/file-max 
100977
[root@localhost ~]# cat /proc/sys/fs/file-nr 
2112	0	100977
[root@localhost ~]# ulimit -a    ;显示目前资源限制的设定
core file size          (blocks, -c) 0   
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited  
pending signals                 (-i) 7922
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7922
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]#

如果需要临时修改文件句柄数可以使用以下操作:

[root@localhost ~]# ulimit -HSn 4096
[root@localhost ~]# ulimit -n
4096
[root@localhost ~]#

H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量

如何查看当前系统打开文件数最多的程序:

lsof(list open files)是一个列出当前系统打开文件的工具。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件

lsof -n 不将IP转换为hostname,缺省是不加上-n参数 eg:# lsof  /GTES11/

lsof -i 用以显示符合条件的进程情况  eg:# lsof -i :22

[root@localhost ~]# lsof -n|awk ‘{print $2}‘|sort -nr|uniq -c|sort -nr|head -5
    162 1812
    149 1827
    126 1591
    107 1823
    100 1826
[root@localhost ~]#

如何查看某一程序打开文件数:lsof -p pid

[root@localhost ~]# lsof -p 1812|wc -l
163
[root@localhost ~]# lsof -p 1827|wc -l
150
[root@localhost ~]#


本文出自 “我本不是菜鸟” 博客,请务必保留此出处http://pvbutler.blog.51cto.com/7662323/1558092

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。