linux打开文件数(ulimit)

linux系统在使用过程中出现too many open files或者如下错误提示,如图:

此错误提示原因为打开文件数超过设定值,默认情况下为1024,可通过命令ulimit -n来查看

如果要设置最大打开文件数,可采用两种方法,第一种是进程级别的,第二种是系统级别的,

1、进程级别,有临时设置和永久设置之分:

临时设置可通过ulimit -n 65535命令来设置,不过只针对当前终端有效,一旦退出了当前终端或者重启了机器,设置随之失效,因此建议采用永久设置方式

如果要永久生效,需要修改文件limits.conf,编辑文件/etc/security/limits.conf,添加内容如下:

说明:

* soft nproc 65535      #限制用户最多打开的进程数,*表示所有用户
* hard nproc 65535      #限制用户最多打开的进程数
* soft nofile 65535     #限制用户最多打开的文件数(软限制)
* hard nofile 65535     #限制用户最多打开的文件数(硬限制)

注意:设置完成后退出终端并重新链接即可看到生效了,无需重启服务器

soft软限制,可超过这个值,但超过会告警
hard硬限制,不能超过这个值,超过会报错
nproc操作系统对每个用户创建的进程数的限制
nofile每个进程可打开的文件数限制

也可以针对某个服务设置最大打开文件数,在服务中配置,例如docker.service,如图:

  • infinity等价于 65536

说明:

Linux上能打开的最大文件数量受三个参数影响,分别是:

  • fs.file-max(系统级别参数):该参数描述整个系统可以打开的最大文件数量。但是root用户不会受限制(如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符),默认值是内存大小的10%,可通过命令(grep MemTotal /proc/meminfo | awk ‘{printf(“%d”,$2/10)}’) 获取
  • soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数,只能在Linux上配置一次,不能针对不同用户配置不同的值
  • fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值,通常默认值为1024*1024=1048576

这三个参数之间存在耦合关系,因此配置值的时候还需要注意以下三点:

  • 如果想修改soft nofile,那么hard nofile参数值也需要一起调整。如果hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来
  • 如果修改了hard nofile,那么fs.nr_open也需要一起调整(fs.nr_open参数值一定要大于hard nofile参数值)。如果hard nofile的值设置的比fs.nr_open还大,会导致该用户无法登录,如果设置的是*,那么所有用户都无法登录
  • 如果修改了fs.nr_open,但是是用的echo “xxx” > ../fs/nr_open命令来修改的fs.nr_open的值,那么刚改完可能不会有问题,但是只要机器一重启,那么之前通过echo命令设置的fs.nr_open值便会失效,用户还是无法登录。所以非常不建议使用echo的方式修改内核参数!!!

查看默认的nr_open和file-max参数大小,如图:

2、修改nr_open和file-max的值

(1)、临时生效:

echo 1500000 > /proc/sys/fs/nr_open
echo 180000 > /proc/sys/fs/file-max

(2)、永久生效(无需重启服务器):

编辑文件/etc/sysctl.conf,添加参数fs.nr_open和fs.file-max,如图:

设置完成后执行如下命令让配置生效:

sysctl -p

可通过如下命令查看单进程打开文件最大数:

cat /proc/pid/limits

标签