linux打开文件数(ulimit)
linux系统在使用过程中出现too many open files或者如下错误提示,如图:

此错误提示原因为打开文件数超过设定值,默认情况下为1024,可通过命令ulimit -n来查看
如果要设置最大打开文件数,可采用两种方法,第一种是进程级别的,第二种是系统级别的,
1、进程级别(单个进程),有临时设置和永久设置之分:
临时设置可通过ulimit -n 65535命令来设置,不过只针对当前终端有效,一旦退出了当前终端或者重启了机器,设置随之失效,因此建议采用永久设置方式
如果要永久生效,需要修改文件limits.conf,编辑文件/etc/security/limits.conf,添加内容如下:
# 全局所有用户
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# root单独放开(避免root被限制)
root soft nofile 65535
root hard nofile 65535
root soft nproc 65535
root hard nproc 65535
说明:
* soft nproc 65535 #限制用户单个进程最多打开的进程数,*表示所有用户
* hard nproc 65535 #限制用户单个进程最多打开的进程数
* soft nofile 65535 #限制用户单个进程最多打开的文件数(软限制)
* hard nofile 65535 #限制用户单个进程最多打开的文件数(硬限制)
为什么root用户单独设置?
* 是 Linux 专门给普通非 root 用户的默认规则,内核 PAM 模块写死排除 root;想要 root 也同步拉高 ulimit,只能单独声明 root 行
注意:设置完成后退出终端并重新链接即可看到生效了,无需重启服务器
| soft | 软限制,可超过这个值,但超过会告警 |
| hard | 硬限制,不能超过这个值,超过会报错 |
| nproc | 操作系统对每个用户创建的进程数的限制 |
| nofile | 每个进程可打开的文件数限制 |
2、也可以针对某个服务设置最大打开文件数,在服务中配置,例如docker.service,如图:

- infinity等价于 65536
或者配置 systemd 全局默认限制,编辑文件:
vim /etc/systemd/system.conf
#取消注释,修改后面数值,格式用 `软:硬` 冒号分隔
DefaultLimitNOFILE=65535:65535
DefaultLimitNPROC=65535:65535
重载配置
systemctl daemon-reload
3、Linux上能打开的最大文件数量受三个参数影响,分别是:
- fs.file-max(系统级别参数):整个系统所有进程可以打开的最大文件数量。但是root用户不会受限制(如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符),默认值是内存大小的10%,可通过命令(grep MemTotal /proc/meminfo | awk ‘{printf(“%d”,$2/10)}’) 获取
- soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数,只能在Linux上配置一次,不能针对不同用户配置不同的值,soft nofile不能超过hard nofile
- fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数的硬上限。hard nofile的值不能超过nr_open,可以针对不同用户配置不同的值,通常默认值为1024*1024=1048576,
这三个参数之间存在耦合关系,因此配置值的时候还需要注意以下三点:
- 如果想修改soft nofile,那么hard nofile参数值也需要一起调整。soft nofile 不能超过hard 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


