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

标签