80652319 2017-05-11
最近部署上线的一个引擎,启动之后内存、日志显示一切正常,但是外部无法进行引擎访问。几经周折,在同事的协助下,找出了问题:root用户的open files为1024,引擎启动时,1024个文件句柄已经用尽。在晚上看到一篇不错的文章,就转下来了:http://jameswxx.iteye.com/blog/2096461。以下是文章内容:
写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指。到底最大文件数被什么限制了?too many open files错误到底可以通过什么参数控制?网上的很多文章说的大致步骤是没有错的,大致如下:shell级限制 通过ulimit -n修改,如执行命令ulimit -n 1000,则表示将当前shell的当前用户所有进程能打开的最大文件数量设置为1000.用户级限制 ulimit -n是设置当前shell的当前用户所有进程能打开的最大文件数量,但是一个用户可能会同时通过多个shell连接到系统,所以还有一个针对用户的限制,通过修改 /etc/security/limits.conf实现,例如,往limits.conf输入以下内容:root soft nofile 1000root hard nofile 1200soft nofile表示软限制,hard nofile表示硬限制,软限制要小于等于硬限制。上面两行语句表示,root用户的软限制为1000,硬限制为1200,即表示root用户能打开的最大文件数量为1000,不管它开启多少个shell。系统级限制修改cat /proc/sys/fs/file-max
但是呢,有很多很重要的细节,有很多错误的描述,一塌糊涂,因此特的在这里做一个说明。
还有,很多文章称ulimit -n 只允许设置得越来越小,比如先执行了ulimit -n 1000,在执行ulimit -n 1001,就会报"cannot modify limit: Operation not permitted"错误。这个其实也是不准确的说法。首先要搞清楚,任何用户都可以执行ulimit,但root用户和非root用户是非常不一样的。 非root用户只能越设置越小,不能越设置越大
我在机器上以非root先执行:
[wxx@br162 etc]$ ulimit -n 900 [wxx@br162 etc]$
执行成功,再增大:
[wxx@br162 etc]$ ulimit -n 901-bash: ulimit: open files: cannot modify limit: Operation not permitted [wxx@br162 etc]$
增加失败,如果减少则是OK的:
[wxx@br162 etc]$ ulimit -n 899 [wxx@br162 etc]$
如果再增加到900是不行的:
[wxx@br162 etc]$ ulimit -n 900-bash: ulimit: open files: cannot modify limit: Operation not permitted [wxx@br162 etc]$
root用户不受限制
首先切换到root:
[wxx@br162 etc]$ sudo su - [root@br162 ~]#
查看下当前限制:
[root@br162 ~]# ulimit -n1000000 [root@br162 ~]#
增大:
[root@br162 ~]# ulimit -n 1000001
[root@br162 ~]# 可以成功增大,再减小:
[root@br162 ~]# ulimit -n 999999 [root@br162 ~]#
减小也是成功的,再增大:
[root@br162 ~]# ulimit -n 1000002
[root@br162 ~]# 也是ok的,可见root是不受限制的。
ulimit里的最大文件打开数量的默认值
如果在limits.conf里没有设置,则默认值是1024,如果limits.con有设置,则默认值以limits.conf为准。例如我换了一台机器,登录进去,ulimit -n显示如下:
[root@zk203 ~]# ulimit -n 2000
这是因为我的limits.conf里的文件打开数是2000,如下:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile 2000 root hard nofile 2001
如果limits.conf里不做任何限制,则重新登录进来后,ulimit -n显示为1024。
[root@zk203 ~]# ulimit -n
1024
ulimit修改后生效周期
修改后立即生效,重新登录进来后失效,因为被重置为limits.conf里的设定值
好吧,其实这要分两种情况,root用户是可以超过的,比如当前limits.conf设定如下:
root soft nofile 2000 root hard nofile 2001
但是我用root将最大文件数设定到5000是成功的:
[root@zk203 ~]# ulimit -n 5000 [root@zk203 ~]# ulimit -n 5000 [root@zk203 ~]#
但是非root用户是不能超出limits.conf的设定,我切换到wxx,执行命令如下:
[wxx@zk203 ~]# ulimit -n 5000
-bash: ulimit: open files: cannot modify limit: Operation not permitted [wxx@zk203 etc]$
所以网上的说法是错误的,即使非root用户的最大文件数设置不能超过limits.conf的设置,这也只是一个表象,实际上是因为,每个用户登录进来,ulimit -n的默认值是limits.conf的 soft nofile指定的,但是对于非root用户,ulimit -n只能越来越小,不能越来越大,其实这个才是真正的原因,但是结果是一样的。
修改了limits.conf需要重启系统?
这个说法非常搞笑,修改了limits.conf,重新登录进来就生效了。在机器上试试就知道了,好多人真的很懒,宁愿到处问也不愿意花一分钟时间实际操作一下。
[root@zk203 ~]# cat /proc/sys/fs/file-max1610495
我将limits.conf里文件最大数量设定为1610496,保存后,打印出来:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile1610496 root hard nofile1610496
" \ \ / /_ | / | _ \ / | / / _ | \ | | | / |. " \ \ / / | || |/| | |) | | | | | | | | | | | | | | _.