写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指。到底最大文件数被什么限制了?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]$
执行成功,再增大:
[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 ~]#
查看下当前限制:
[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
2000
这是因为我的limits.conf里的文件打开数是2000,如下:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile 2000root 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@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
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决定
相关推荐
修改文件句柄数在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象...
Linux 进程句柄数设置详解 在 Linux 系统中,进程句柄数设置是一个重要的参数,它决定了单个进程能够打开的最大文件句柄数量,包括 socket 连接。系统默认值为 1024,这对于一般的应用来说已经足够使用。但是,对于...
—-查看当前进程打开了多少句柄数 # lsof -n|awk ‘{print $2}’|sort|uniq -c|sort -nr|more 131 24204 57 24244 57 24231 …….. 其中第一列是打开的句柄数,第二列是进程ID。 可以根据ID号来查看进程名。 # ...
linux 系统级别的能够打开的文件句柄的数file-max命令 Linux 系统中,file-max 命令用于设置系统级别的能够打开的文件句柄的数量,这个值决定了 Linux 内核可以分配的文件句柄的最大数量。当系统中的文件句柄数量...
本文将深入探讨Linux如何管理打开文件数,包括查看当前打开文件数的方法、理解系统限制以及如何调整这些限制。 ### 查看当前打开文件数 在Linux中,可以通过多种方式来查看当前系统打开的文件数。最常见的方法是...
在Linux操作系统中,进程的资源使用受到多个因素的限制,包括最大线程数、进程最大数以及进程可以打开的文件数。这些限制是由系统内核设定的,旨在保证系统的稳定性和资源的有效分配。 首先,我们来看进程的最大...
例如,如果一个程序不断打开文件但忘记关闭,可能导致句柄泄漏,查看句柄可以帮助找到问题所在。 此外,句柄还与多线程编程紧密相关。线程间的同步常通过共享资源和句柄来实现,例如使用互斥量(mutex)句柄来确保...
#### 二、Linux进程标识符 1. **PID(Process ID)**: - PID是进程标识符,每个运行中的进程都有一个唯一的PID。 - PID由内核分配,用于唯一标识一个进程。 - 通过命令如`ps`可以查看当前系统的进程列表及其PID...
在Unix和Linux操作系统中,系统资源的管理是一个关键任务,其中就包括了限制一个用户或进程可以打开的最大文件数。这个限制通常被称为“最大打开文件数”,它由`ulimit`命令来控制。`ulimit -n`命令用于查看或设置一...
在Linux中,文件描述符(File Descriptor)是句柄的一种具体形式,它是进程用来访问打开文件的一个索引值。每个进程都有一个文件描述符表,包含了所有已打开文件的句柄。文件描述符从0开始,通常0、1、2分别对应标准...
open 函数的返回值是一个整数,如果打开文件成功则返回打开的文件句柄,否则返回 -1。 六、错误代码 open 函数可能会返回以下错误代码: * EEXIST:参数 pathname 所指的文件已存在,却使用了 O_CREAT 和 O_EXCL ...
例如,使用以下命令可以查看当前用户进程可打开文件数限制: [speng@as4 ~]$ ulimit -n 这将显示当前用户进程可打开文件数限制。例如,输出结果为 1024,表示当前用户进程最多允许同时打开 1024 个文件。 为了...
可使用 ulimit 命令查看系统允许当前用户进程打开的文件数限制。 为了提高用户进程可打开文件数限制,我们可以修改 `/etc/security/limits.conf` 文件,并添加以下行: ``` * soft nofile 10240 * hard nofile ...
1. **文件号**:文件号通常是操作系统内部用于跟踪打开文件的一种标识,它是一个整数值,通常在进程内部使用。文件号主要用于内核级别的文件操作,如读写和关闭文件。在某些操作系统中,如Linux,文件描述符就是文件...
监控进程句柄使用量通常需要使用`lsof`命令,它可以列出进程打开的文件、网络连接等信息。结合`wc`命令统计行数,可以了解进程打开的句柄数量。 5. **查看TCP/UDP端口监听状态** 使用`netstat`命令可以查看网络...
由于操作系统需要内存来管理这些句柄,因此对打开文件数量的限制是为了防止内存耗尽,确保系统的稳定性和安全性。 在CentOS 7这样的Linux环境中,系统默认设置了一个最大文件描述符(file descriptor)的数量,可以...
该函数可以以各种方式打开文件,并返回打开的文件句柄,-1 表示打开失败。 参数 pathname 指向欲打开的文件路径字符串,可以是相对路径也可以是绝对路径。 flags 参数是一系列常数值,可以同时选择多个常数用按位...
在Linux中,可以通过`ulimit -n`命令来查看当前用户的进程可打开文件句柄的最大数量。例如,执行`ulimit -n`后显示的结果为1024,这意味着该用户的每个进程最多可以打开1024个文件。考虑到标准输入、标准输出、标准...