linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。
先介绍如何修改系统级的限制
通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下:
$ulimit -n
1024
当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的session有效,当断开连接重新连接后更改就失效了。
如果想永久变更需要修改/etc/security/limits.conf 文件,如下:
vi /etc/security/limits.conf
* hard nofile 102400
* soft nofile 102400
保存退出后重新登录,其最大文件描述符已经被永久更改了。
这只是修改用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制。
系统级的限制
它是限制所有用户打开文件描述符的总和,可以通过修改内核参数来更改该限制:
sysctl -w fs.file-max=102400
使用sysctl命令更改也是临时的,如果想永久更改需要在/etc/sysctl.conf添加
fs.file-max=102400
保存退出后使用sysctl -p 命令使其生效。
与file-max参数相对应的还有file-nr,这个参数是只读的,可以查看当前文件描述符的使用情况。
下面是摘自kernel document中关于file-max和file-nr参数的说明
转自 http://salogs.com
note:
有时,这样修改完成后,重启系统,使用ipcs -l后发现,修改的内核参数仍然是默认值,
并没有生效。这可能是因为,在系统启动时,加载内核参数后,启动级别较低的服务又
重新修改了内核参数。一个较简单的解决方案是在rc.local里,加上sysctl -p,重新加
载内核参数。该文件是在系统启动时,最后执行的脚本。