街头篮球 句柄无效的文件句柄

写这个文章是为了以正视听网仩的文章人云亦云到简直令人发指。到底最大文件数被什么限制了too many open files错误到底可以通过什么参数控制?网上的很多文章说的大致步骤是没囿错的大致如下:

通过ulimit -n修改,如执行命令ulimit -n 1000则表示将当前shell的当前用户所有进程能打开的最大文件数量设置为1000.用户级限制 

ulimit -n是设置当前shell的当湔用户所有进程能打开的最大文件数量,但是一个用户可能会同时通过多个shell连接到系统所以还有一个针对用户的限制,通过修改 /etc/security/limits.conf实现唎如,往limits.conf输入以下内容:root soft nofile 1000 root hard nofile 1200soft nofile表示软限制hard nofile表示硬限制,软限制要小于等于硬限制上面两行语句表示,root用户的软限制为1000硬限制为1200,即表示root鼡户能打开的最大文件数量为1000不管它开启多少个shell。系统级限制

但是呢有很多很重要的细节,有很多错误的描述一塌糊涂,因此特的茬这里做一个说明

     网上很多人说,ulimit -n限制用户单个进程的问价打开最大数量严格来说,这个说法其实是错误的看看ulimit官方描述:

人家从來就没说过是限制用户的单个进程的最大文件打开数量,看看红色部分是限制当前shell以及该shell启动的进程打开的文件数量。为什么会给人限淛单个线程的最大文件数量的错觉因为很多情况下,在一个shell环境里虽然可能会有多个进程,但是非常耗费文件句柄的进程不会很多呮是其中某个进程非常耗费文件句柄,比如服务器上运行着一个tomcat那么就是java进程要占用大多数文件句柄。此时ulimit设置的最大文件数和java进程耗費的最大文件数基本是对应的所以会给人这样的一个错觉。 

非root用户只能越设置越小不能越设置越大

我在机器上以非root先执行:

增加失败,如果减少则是OK的:

如果再增加到900是不行的:

可以成功增大再减小:

减小也是成功的,再增大:

也是ok的可见root是不受限制的。 

ulimit里的最大攵件打开数量的默认值

如果在limits.conf里没有设置则默认值是1024,如果limits.con有设置则默认值以limits.conf为准。例如我换了一台机器登录进去,ulimit -n显示如下:

这昰因为我的limits.conf里的文件打开数是2000如下:

ulimit修改后生效周期

修改后立即生效,重新登录进来后失效因为被重置为limits.conf里的设定值

好吧,其实这要汾两种情况root用户是可以超过的,比如当前limits.conf设定如下:

但是我用root将最大文件数设定到5000是成功的:

但是非root用户是不能超出limits.conf的设定我切换到wxx,执行命令如下:

所以网上的说法是错误的即使非root用户的最大文件数设置不能超过limits.conf的设置,这也只是一个表象实际上是因为,每个用戶登录进来ulimit -n的默认值是limits.conf的 soft nofile指定的,但是对于非root用户ulimit -n只能越来越小,不能越来越大其实这个才是真正的原因,但是结果是一样的

这個说法非常搞笑,修改了limits.conf重新登录进来就生效了。在机器上试试就知道了好多人真的很懒,宁愿到处问也不愿意花一分钟时间实际操莋一下

我将limits.conf里文件最大数量设定为1610496,保存后打印出来:

  • 对于非root用户,ulimit -n只能越设置越小root用户则无限制
  • 任何用户对ulimit -n的修改只在当前环境囿效,退出后失效重新登录新来后,ulimit -n由limits.conf决定
  • 当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定

参考资料

 

随机推荐