当打开文件进行访问时,操作系统会临时为文件分配一个称为文件句柄的数字。主存的一个特殊区域是为文件句柄保留的,这个区域的大小决定了一次可以打开多少个文件。Linux 上的进程受到许多约束的限制,这些约束也阻止它们正确执行,并且每个进程都有一些与之相关的限制。shell 限制程序可以同时打开的文件句柄的数量。在本文中,我将向您展示可用于更改 Linux 中打开文件限制数量的不同方法。
为什么要限制打开文件的数量
由于操作系统需要内存来管理每个文件,因此您可能会面临可以打开的文件数量的限制。由于程序也可以关闭文件处理程序,因此它可以创建任意大小的文件,直到所有可用磁盘空间都已满。在这种情况下,安全性的一个方面是通过施加限制来防止资源耗尽。
在 Linux 下,有两种限制:
- 软****限制是可以随时由进程更改的值。
- 硬****限制标记通过设置软限制不能超过的最大值
您可以看到在您的 Linux 系统上打开的文件描述符的最大数量,如下所示:
# cat /proc/sys/fs/file-max
100576
该值显示用户在每个登录会话中可以打开的文件数,但您应该注意到结果可能会因您的系统而异。由于某些原因,您可能需要增加限制集的值。这就是为什么您的 Linux 系统提供了通过更改每个进程和每个系统的最大打开文件数来修改这些限制的可能性(增加或减少)。
1) ulimit 命令
ulimit 命令可用于增加可在 shell 中打开的文件数。该命令是 bash 内置命令,因此它只影响 bash 和从它启动的程序。ulimit 语法如下:
ulimit [options [limit]]
这些选项定义了受到限制的内容。您可以看到一些选项如下
-a
(Current Settings Passing):使 ulimit 报告其当前设置。-f
(File Limits) 限制 shell 可以创建的文件的大小-n
限制打开文件描述符的数量。-H
和-S
(硬和软限制)选项修改其他选项,使它们分别设置为硬限制或软限制。随后可能不会增加硬限制,但可能会增加软限制。如果两个选项均未提供,则 ulimit 会为指定的功能设置硬限制和软限制。
因此,要查看当前限制,您可以执行以下操作:
$ ulimit -a | grep open
open files (-n) 1024
您可以检查硬限制,如下所示:
$ ulimit -Hn
4096
和软限制如下:
$ ulimit -Sn
1024
您可以编辑限制如下
$ ulimit -n 3000
您可以检查以下内容:
$ ulimit -n
3000
现在的问题是,如果您注销并登录或重新启动计算机,该值将被重置。请记住,使这些限制更加永久需要通过将 ulimit 命令行添加到文件末尾来编辑用户的配置文件 (.bashrc
或.profile
) 或系统范围的配置文件 (/etc/bashrc
或),如下所示/etc/profile
# vim .bash_profile
ulimit -n 3000
现在即使重新启动,用户设置的限制也将是永久的。您可以选择仅增加硬限制 (-Hn
) 或软限制 (-Sn
),但您应该注意,软限制可以由任何用户设置,而硬限制一旦设置后只能由 root 更改。
2) 可插拔认证模块 (PAM) 模块
施加此类限制最好通过名为pam_limits的可插入身份验证模块 (PAM) 模块来完成。大多数主要的 Linux 发行版都将此模块用作其标准 PAM 配置的一部分,因此它已经存在于某些 Linux 系统上,但您需要通过编辑/etc/security/limits.conf
文件来配置它。该文件包含四个基本字段:
- domain**:**它描述了限制适用的实体。它可以是用户名、组名(格式为 @groupname)或星号 ( * ) 通配符,可匹配所有人。但是,您应该注意到通配符不适用于 root 用户
- type**:**此字段将限制指定为硬或软。硬限制是系统管理员强加的,在任何情况下都不能超过,而用户可以暂时超过软限制。您也可以使用破折号 (-) 来表示限制是硬限制和软限制。请注意,软限制可能会增加到硬限制的值
- item**:**它指定限制的项目类型。这可以是_nofile_(打开的数据文件的数量)、fsize(用户创建的文件的大小)、core(核心文件的大小)等
- value**:**它指定要应用于限制的值
例如,您可以看到该文件的内容如下:
# tail -f -n 12 /etc/security/limits.conf
#<domain>?????? <type>?? <item>???????? <value>??????
#
#*?????????????? soft??? core??????????? 0
#*?????????????? hard??? rss???????????? 10000
#@student??????? hard??? nproc?????????? 20
#@faculty??????? soft??? nproc?????????? 20
#@faculty??????? hard??? nproc?????????? 50
#ftp???????????? hard??? nproc????? ?????0
#@student??????? -?????? maxlogins?????? 4
# End of file
要编辑所有用户的最大打开文件数,您可以添加,例如,在文件末尾添加以下行:
# vim /etc/security/limits.conf
*?????? hard??? nofile? 20000
*?????? soft??? nofile? 15000
在此之后,您需要编辑文件/etc/pam.d/login
# vim /etc/pam.d/login
session required pam_limits.so
然后保存文件。您可以检查结果如下:
$ ulimit -Hn
20000
3) 系统范围的限制
在 Linux 系统上,我们有file-max,它是最大的文件描述符 (FD),ulimit 和 file-max 的默认设置假定多个用户将共享系统。这就是这些设置限制每个用户使用的资源数量的原因。/etc/sysctl.conf
您可以通过编辑或编辑指令来增加 Linux 中打开文件的限制fs.file-max
您可以使用命令查看打开文件的当前值
# cat /proc/sys/fs/file-max
100576
您可以编辑默认值,如下所示:
# sysctl -w fs.file-max=250000
fs.file-max = 250000
您可以检查结果如下
# cat /proc/sys/fs/file-max
250000
通过使用sysctl 命令,修改将应用到下次重新启动。要使配置持久化,您可以直接编辑/etc/sysctl.conf
文件,如下所示:
# vim /etc/sysctl.conf
fs.file-max=250000
如果列出 的内容/proc/sys/fs/file-max
,您会看到更改没有直接生效。现在您需要使用 sysctl 命令的 -p 选项直接应用更改,如下所示:
# sysctl -p
fs.file-max = 250000
现在配置是永久的