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


