Linux:too many open files问题及解决方式
文章目录
文件数可以从三个维度限制:分别为操作系统限制,shell限制,以及进程限制.
查看进程占用的句柄数
查看当前shell下的文件句柄数限制:
ulimit -a
查看系统各个进程打开个文件句柄数:
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
单独获取某一程序文件数限制(9928为进程id)
cat /proc/9928/limits
shell级限制
通过ulimit -n修改,如执行命令ulimit -n 1000,则表示将当前shell的当前用户所有进程能打开的最大文件数量设置为1000.
Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。
硬限制是实际的限制,而软限制,是warnning限制,只会做出warning
默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改
对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户
对于非root用户,ulimit -n只能越设置越小,root用户则无限制
之前启动过的程序要重新启动才能使用新的值。
ulimit是作为一种“临时限制”来存在的。我来举个例子。假设我开了一个用户root登录shell A,设置ulimit -SHn 65535,这个用户启动了程序A(比如nginx),当用户退出shell A后A程序继续工作在65535个文件打开限制。这时候,当用户root登录到shell B,查看ulimit -n 还是1024个 查看(self是到当前程序 PID的软连接)
任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定
操作系统限制
用root用户修改/etc/security/limits.conf 配置,在文件末尾添加如下内容:
user soft nofile 2048
user hard nofile 65536
其中user为用户名,根据部署环境配置。注意"nofile"项有两个可能的限制措施。就是hard和soft。user可以用*来表示匹配除了root外的所有用户.
硬限制表明soft限制中所能设定的最大值。soft限制指的是当前系统生效的设置值。hard限制值可以被普通用户降低。但是不能增加。
soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。
/proc/sys/fs/file-max限制不了/etc/security/limits.conf
只有root用户才有权限修改/etc/security/limits.conf
文章作者 Forz
上次更新 2018-11-20