`
jameswxx
  • 浏览: 776979 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

linux最大文件句柄数量总结

 
阅读更多

原创文章,转载请注明出处: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 1000
root hard nofile 1200
soft nofile表示软限制,hard nofile表示硬限制,软限制要小于等于硬限制。上面两行语句表示,root用户的软限制为1000,硬限制为1200,即表示root用户能打开的最大文件数量为1000,不管它开启多少个shell。

系统级限制
修改cat /proc/sys/fs/file-max
 
 
但是呢,有很多很重要的细节,有很多错误的描述,一塌糊涂,因此特的在这里做一个说明。

一  ulimit -n

     网上很多人说,ulimit -n限制用户单个进程的问价打开最大数量。严格来说,这个说法其实是错误的。看看ulimit官方描述:
Provides control over the resources available to the shell and to processes started by  it,  on  systems that allow such control. The -H and -S options specify that the hard or soft limit is set for the given resource. A hard limit cannot be increased once it is set; a soft limit may  be  increased  up  to  the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft,  or  unlimited,  which  stand  for  the  current hard limit, the current soft limit, and no limit,  respectively.
If limit is omitted, the current value of the soft limit  of  the  resource  is  printed,  unless  the  -H  option is given.  When more than one resource is specified, the limit name and unit are  printed before the value.
 
人家从来就没说过是限制用户的单个进程的最大文件打开数量,看看红色部分,是限制当前shell以及该shell启动的进程打开的文件数量。为什么会给人限制单个线程的最大文件数量的错觉,因为很多情况下,在一个shell环境里,虽然可能会有多个进程,但是非常耗费文件句柄的进程不会很多,只是其中某个进程非常耗费文件句柄,比如服务器上运行着一个tomcat,那么就是java进程要占用大多数文件句柄。此时ulimit设置的最大文件数和java进程耗费的最大文件数基本是对应的,所以会给人这样的一个错觉。 
  
还有,很多文章称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 -n
1000000
[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里的设定值
 
 
 

二  /etc/security/limits.conf

网上还有缪传,ulimit -n设定的值不能超过limits.conf里设定的文件打开数(即soft nofile)
好吧,其实这要分两种情况,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,重新登录进来就生效了。在机器上试试就知道了,好多人真的很懒,宁愿到处问也不愿意花一分钟时间实际操作一下。
 
 

三  /proc/sys/fs/file-max

网上说,ulimit -n 和limits.conf里最大文件数设定不能超过/proc/sys/fs/file-max的值,这也是搞笑了,/proc/sys/fs/file-max是系统给出的建议值,系统会计算资源给出一个和合理值,一般跟内存有关系,内存越大,改值越大,但是仅仅是一个建议值,limits.conf的设定完全可以超过/proc/sys/fs/file-max。
[root@zk203 ~]# cat /proc/sys/fs/file-max
1610495
我将limits.conf里文件最大数量设定为1610496,保存后,打印出来:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile1610496
root hard nofile1610496
 
 

四  总结一下

  • /proc/sys/fs/file-max限制不了/etc/security/limits.conf
  • 只有root用户才有权限修改/etc/security/limits.conf
  • 对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户
  • 对于非root用户,ulimit -n只能越设置越小,root用户则无限制
  • 任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定
  • 如果limits.conf没有做设定,则默认值是1024
  • 当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定

 

分享到:
评论
3 楼 hyh1989 2016-04-14  
另外咨询两个个问题
当前shell命令开启的所有进程数的计算方式(比如说一个上层shell,开启了很多后台进程,这些进程开启的文件句柄总和才是当前shell开启句柄数,还是只看当前shell开启了直接多少文件或者启动了多少进程,至于每个进程自己开启的句柄,不算在当前shell使用的句柄)
当前shell使用句柄数如果超出句柄数限制,会发生什么现象
2 楼 hyh1989 2016-04-14  
赞一个,释义了很多疑问
1 楼 hyh1989 2016-04-14  
root soft nofile 1000
root hard nofile 1200
soft nofile表示软限制,hard nofile表示硬限制,软限制要小于等于硬限制。上面两行语句表示,root用户的软限制为1000,硬限制为1200,即表示root用户能打开的最大文件数量为1000,不管它开启多少个shell。


这里是不是应该是root用户的单个shell能够打开的文件数量为1000个?

相关推荐

    linux的最大进程句柄数设置

    在 Linux 系统中,进程句柄数设置是一个重要的参数,它决定了单个进程能够打开的最大文件句柄数量,包括 socket 连接。系统默认值为 1024,这对于一般的应用来说已经足够使用。但是,对于需要处理大量请求的应用,如...

    Linux文件句柄限制总结

    文章目录文件句柄查看用户级别(nofile)单个进程级别(nr_open )系统级别(file-max)修改用户级别(nofile)单个进程级别(nr_open )系统级别(file-max)总结参考 tips: 网上说什么的也有,你抄我的我抄你的...

    Linux下查看进程打开的文件句柄数和如何修改方法

    修改文件句柄数在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象...

    linux系统级别的能够打开的文件句柄的数file-max命令.docx

    file-nr 文件中包含三个数字:第一个数字表示已经分配了的文件描述符数量,第二个数字表示空闲的文件句柄数量,第三个数字表示能够打开文件句柄的最大值(跟 file-max 一致)。 此外,Linux 系统中还存在 ulimit ...

    marmot-cn#readingNotes#设置linux打开文件句柄:proc:sys:fs:file-max和ulimit

    设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别表示系统级别的能够打开的文件句柄的数量.是对整个系统的限制,并不是

    linux 句柄

    - 这个命令将最大文件描述符数量限制为4096,其中`-H`表示硬限制,`-S`表示软限制,`-n`表示最大文件描述符数量。 - 修改这些设置通常需要编辑用户的`.bash_profile`或系统的`/etc/profile`文件。 #### 五、资源...

    linux打开文件数

    除了进程级别的限制,Linux系统本身也有一个总的文件句柄限制,这个限制决定了整个系统能同时打开的最大文件数量。这个值可以通过读取`/proc/sys/fs/file-nr`文件来获取: ```bash cat /proc/sys/fs/file-nr ``` ...

    3 种方法教你在 Linux 中修改打开文件数量限制.doc

    文件句柄是操作系统为每一个打开的文件分配的唯一标识,它存储在主内存的一个特定区域,这个区域的大小决定了系统能同时处理多少个文件。由于操作系统需要内存来管理这些句柄,因此对打开文件数量的限制是为了防止...

    linux下文件描述符限制问题

    linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以查看。此值可以修改。 进程的文件描述符,可以通过 [root@localhost ~]# ls -al /proc/13623/fd |wc -l 59 输出...

    Linux内核调优

    然而,Linux系统默认对每个进程可打开的文件句柄数量进行了限制,这通常是基于安全性和资源管理的考虑。 #### 三、查看当前文件句柄限制 在Linux中,可以通过`ulimit -n`命令来查看当前用户的进程可打开文件句柄的...

    39 案例实战:如何解决经典的Too many connections故障?背后原理是什么.pdf

    当MySQL数据库尝试建立超过系统允许的文件句柄数量的连接时,就会发生Too many connections错误。这通常是因为Linux的文件句柄限制导致MySQL的最大连接数受到了限制。 Linux系统中用于查看和修改文件句柄限制的命令...

    文件最大数修改

    #### 四、Linux文件句柄限制机制 在Linux系统中,每个用户可同时打开的文件数量是有上限的。这些文件句柄(也称为文件描述符)用于跟踪每个打开的文件或网络连接等资源。 ##### 4.1 查看系统全局最大文件数限制 ...

    查看句柄查看句柄查看句柄

    例如,在C#中,可以使用`System.Diagnostics.Process`类的`Handles`属性获取进程的句柄数量。在Python中,可以利用`psutil`库获取进程的句柄信息。 句柄的查看不仅可以帮助定位资源泄露问题,还可以用于优化代码,...

    Linux文件存在程序找不到文件.pdf

    如果经常遇到此问题,可能需要优化程序以减少打开的文件数量,或者增加系统允许的最大文件句柄数。 解决这类问题的关键在于排查每个环节,从编码、路径、权限到系统状态。通过仔细检查并逐个排除上述可能的原因,...

    linux_ulimit的使用

    - 其他选项分别对应不同的资源限制,例如 `-c` 表示最大核心文件大小,`-d` 表示最大数据段大小,`-n` 表示最大文件句柄数量等。 - `limit` 可以是具体的数字(表示限制值)或者 `unlimited`(表示无限制)。 #### ...

    toomanyopenfiles的原理和解决方案.docx

    "Too many open files" 是一个在Linux系统中常见的错误,主要出现在系统无法处理当前进程中打开的文件句柄数量超过系统设定限制时。该错误通常发生在云服务器上,尤其是在运行复杂应用或服务时。理解这个错误的原理...

    linux下查看系统进程占用的句柄数方法

    例如,`ulimit -n`将显示当前shell会话的文件描述符(句柄)的最大数量。在例子中,这个值是1024,这是系统默认的软限制。硬限制是系统允许的最大值,可以通过`ulimit -Hn`来查看。 要检查某个特定进程当前已经打开...

    linux oracle安装步骤

    为了确保 Oracle 用户有足够的资源使用,需要调整其进程和文件句柄的数量限制。使用 `root` 用户编辑 `/etc/security/limits.conf` 文件,并添加以下内容: ```bash oracle soft nproc 2047 oracle hard nproc ...

    linux驱动开发proc文件初步

    在`/proc/sys/fs`目录下,可以找到与文件系统相关的内核参数,比如最大文件大小限制、文件句柄的最大数量等。 **2.2 /proc/sys/fs/binfmt_misc - 二进制可执行格式杂项** `/proc/sys/fs/binfmt_misc`包含了与二...

Global site tag (gtag.js) - Google Analytics