操作系统在打开文件时会临时分配一个叫文件句柄(file handle)来进行访问,为文件句柄保留一个特殊内存区域,该区域的大小决定了可以同时打开多少个文件,限制了shell可以同时打开的文件句柄的数量。在本文中,我将向你展示不同的方法,更改Linux中打开文件限制的数量。
为何限制打开文件的数目
因为操作系统需要内存来管理每个文件,所以要对可以打开的文件数进行限制。
在Linux下,有两种限制:软限制是指时候都可以更改的值,
硬限制:设置软限制不能超过的最大值
可以在Linux系统上看到打开的文件描述符的最大数量,如下所示:# cat /proc/sys/fs/file-max
100576
这个值显示用户每次登录会话可以打开的文件数,但是要注意,根据你的系统,结果可能不同。
1)ulimit命令
ulimit命令可用于增加在shell中打开的文件数量,此命令是bash命令,因此它仅影响bash和从它启动的程序。ulimit语法如下所示:ulimit [options [limit]]
你可以看到下面的一些选项-a (当前设置):ulimit报告它当前设置,
-f (文件限制)限制由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
现在问题是,如果你注销,并且登录或重新启动计算机,则值将重置。请记住,要让这些更改永久生效,需要编辑用户文件(.bashrc或.profile )或系统级配置文件(/etc/bashrc或/etc/profile )配置,# vim .bash_profile
ulimit -n 3000
现在即使重新启动,用户设置的更改已经永久生效了。
2)可插拔认证模块(PAM )模块
最好通过一个名为pam_limits的可插入身份验证模块(PAM)模块来更改此类限制。大多数主要Linux发行版都使用这个模块作为标准PAM配置的一部分,因此它已经存在于一些Linux系统上,但是你需要通过编辑/etc/security/limits.conf文件来配置,domain:描述限制所适用的实体。它可以是一个用户名,一个组名(使用@groupname)或Asterisk (* ))通配符,匹配每个人,
type:此字段为硬或软限制,
item :它指定要限制的项的类型,
value:它指定应用于限制的值
你可以看到如下文件的内容:# tail -f -n 12 /etc/security/limits.conf
#
#
#* 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)系统范围限制
你可以通过编辑/etc/sysctl.conf或编辑指令fs.file-max来增加Linux中打开文件的限制
你可以使用以下命令查看打开的文件的当前值# 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
现在配置永久生效了。