Linux系统中,对于系统和用户在同一时间打开的文件数目有限制,又因为在linux系统中,“一切都是文件”,如果系统和用户的文件数目达到最大限制,有可能造成系统服务不能正常使用。而CentOS系统默认适配低端平台,默认数值只有1024,在实际的生产(线上)环境中,这个数值远远不够,需要对其做出修改。
以下是常用的修改步骤:
1检查当前用户能够打开的最大文件数目
默认数值是1024
如果仅仅是针对当前的shell做修改,可以直接用ulimit命令做修改,当前修改到1024000
但修改仅仅对当前shell有效,重新打开一个Shell,又回到默认数值1024
因此,有必要修改系统相关配置文件,达到“永久修改”的效果。
2检测当前系统能够打开的最大文件数目
当前CentOS系统能够打开的最大文件数目是1609603,这个数值(默认数值)已经足够了,如果不够,用vi命令修改数值即可。
3修改用户能够同时打开的最大文件数目
如果想要“永久修改”,需要用VI命令对系统的配置文件(/etc/security/limits.conf)进行修改,插入* - nofile 1024000,其中 *代表所有用户,-代表包括软连接和硬链接,nofile表示修改的是用户限制文件数目,1024000表示的是具体数值。
重新打开一个shell,则用户打开文件的限制数目已经变成1024000
在实际的运维工程中,笔者发现,有些机器尽管在/etc/security/limits.conf中作出了相应的修改,但用ulimit –n却检测失效,那么有可能是SSH服务器没有配置为使用PAM (UsePAM yes)而导致。
简单来说,/etc/security/limits.conf是给pam_limits模块使用的配置文件,而对于SSH session来说,要使limits.conf生效,则必须确保SSH服务器的配置中UsePAM的选项是有效的。
vim etc/ssh/sshd_config,确认以下的行有效。
4在实际的生产环境中,用命令检测当前系统运行的情况。
检测当前系统实际打开的文件数目。
1248表示系统当前实时打开的文件数目,0表示打开未却又未分配给实际进程的文件数目,1609894表示系统在同一时间能够打开的最大文件数目。
检测当前Java进程实际打开的文件数目
首先查找当前java进程ID为15722
然后根据ID查找java当前实时打开的文件
其中COMMAND:进程名称,PID:进程的id,USER:进程的使用者,FD:文件的描述符,TYPE:文件类型,DEVICE:指定磁盘的名称,SIZE:文件的大小,NODE:索引节点(文件在磁盘上的标识),NAME:打开文件的确切名称
如果仅仅只是想查找java进程打开的文件数目,直接用wc –l命令查找,当前java进程打开的文件数目为760
查找所有进程同时打开的文件数目,可以用lsof和wc命令直接来统计,此时,系统被进程同时打开的文件数目是2454
一个文件可以被多个进程打开,因此一般而言,进程打开的文件数目要比实际打开的文件数目多一些。