Linux最大文件打开数

简介

linux最大打开文件句柄数,即打开文件数最大限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小1024)

为了防止失控的进程破坏系统的性能,UnixLinux 跟踪进程使用的大部分资源,允许用户和系统管理员使用对进程的资源限制,
设置的限制有两种:硬限制软限制:

  • hard:硬限制是可以在任何时候任何进程中设置 但硬限制只能由超级用户修改。
  • soft:软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值。

(noproc)最大线程数和(nofile)文件数。

1
2
3
4
5
6
# nr_open是单个进程可分配的最大文件数
# 一般默认为:1024*1024=1048576
cat /proc/sys/fs/nr_open

# file-max是内核可分配的最大文件数
cat /proc/sys/fs/file-max

在Linux下有时会遇到 Socket/File : Can't open so many files 的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈。

Linux资源的限制

登陆时限制

Linux对用户使用资源的限制通过 PAM 对登陆用户进行身份验证并设置相应的限制。

具体顺序如下。从用户登陆开始,操作系统会依次执行如下三部

    1. /etc/pam.d/login
    1. /etc/pam.d/system-auth
    1. /lib64/security/pam_limits.so

1,/etc/pam.d/login 中调用system-auth

1
cat /etc/pam.d/login

微信截图_20201224172412.png

2,在/etc/pam.d/system-auth 调用 pam_limits.so

1
/etc/pam.d/system-auth

微信截图_20201224172513.png

3,通过grep查看 /lib64/security/pam_limits.so 可以看到 limits.conf和limits.d/*.conf

1
grep -a "/etc/security/limits." /lib64/security/pam_limits.so

微信截图_20201224172633.png

Centos7系统修改

在Centos7系统中,使用 Systemd 替代了之前的 SysV。/etc/security/limits.conf 文件的配置作用域缩小了。/etc/security/limits.conf 的配置,只适用于通过PAM认证登录用户的资源限制,它对 systemdservice 的资源限制不生效。因此登录用户的限制,通过 /etc/security/limits.conf/etc/security/limits.d 下的文件设置即可。

对于 systemd service 的资源设置,则需修改全局配置,全局配置文件放在 /etc/systemd/system.conf/etc/systemd/user.confsystem.conf 是系统实例使用的,user.conf 是用户实例使用的。

1
2
3
4
# vim /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=1048576

reboot 重启后生效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@host-192-175-32-22 bin]# cat /proc/2789/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 1048576 1048576 processes
Max open files 1048576 1048576 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 127951 127951 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
[root@host-192-175-32-22 bin]# ulimit -n
1048576

Red Hat系统修改

查看 /etc/sysctl.conf/etc/sysctl.d/*.conf 的设置,修改 sysctl.conf,修改后须执行 sysctl -p 使修改生效。

1
fs.file-max=6523120

查看 /etc/security/limits.conf 以及 /etc/security/limits.d/*.conf 。操作系统默认先加载 limits.conf 后加载 limits.d/*.conf,所以相同配置后面会覆盖前面,如:/etc/security/limits.d/90-nproc.conf

1
2
*          -       nofile    1048576
* - nproc 1048576

免密登陆

用户不会进行登陆验证过程,所以不会加载 limits.conf 文件,建议通过 /etc/profile 添加 ulimit -n 1048576 命令设置,重新登陆或者执行 source /etc/profile 命令,然后启动服务程序;

查看用户级的最大限制

ulimit -a 或者 ulimit -n

ulimit -n,默认是1024,向阿里云华为云这种云主机一般是 65535。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@host-192-125-30-59 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256967
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256967
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@host-192-125-30-59 ~]# ulimit -n
1024

open files (-n)1024 是linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量)

选项 [options] 含义 例子
-H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

查看某个进程的最大打开文件数和当前打开文件数

先找到该进程的进程号,然后查看

1
2
3
4
5
6
7
8
# 找到pid
ps -aux

# /proc/[pid]/limits和fd

cat /proc/[pid]/limits 显示当前进程的资源限制

ls /proc/[pid]/fd 是一个目录,包含进程打开文件的情况

实例:

1
2
3
4
[root@host-192-125-30-59 ~]# cat /proc/3289/limits| grep files
Max open files 1024 4096 files
[root@host-192-125-30-59 ~]# ll /proc/3289/fd | wc -l
7

ps:如果要查看某个进程的线程的详细信息,/proc/[pid]/task

修改用户级最大限制

临时生效方法:(重启后失效)

这个设置是暂时的保留。当退出Shell会话后,该值恢复原值。

1
ulimit -SHn 1048576

ulimit 命令分软限制和硬限制,加 -H 就是硬限制,加 -S 就是软限制。默认显示的是软限制,如果运行 ulimit 命令修改时没有加上 -H-S ,就是两个参数一起改变。

硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。

用户级修改永久有效方式

修改配置文件 vim /etc/security/limits.conf,加入:

1
2
3
4
5
6
7
8
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# 可以使用下面一行来替代上面
* - nofile 65535
* - nproc 65535

或者使用命令:

1
2
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

* 表示所用的用户,但有的系统不认, 需要具体的用户名, 比如:

1
2
root soft nofile 65535
root hard nofile 65535

有些环境修改后,root用户需要重启机器才生效,而普通用户重新登录后即生效。

需要小心注意的是,有些环境上面这样做,可能导致无法ssh登录,所以在修改时最好打开两个窗口,万一登录不了还可自救。

修改系统级最大限制

其实上面的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。

假如,我们设置进程打开的文件句柄数是 1024 ,但是系统总限制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。

1
2
3
4
5
6
7
# 系统级修改临时生效方式:
echo 6523120 > /proc/sys/fs/file-max

# 系统级修改永久生效方式:
vim /etc/sysctl.conf
# 加入
fs.file-max=6523120

查看系统级文件句柄修改,是否生效

1
sysctl -p

参考:

Linux最大文件打开数

linux最大打开文件句柄数

修改RedHat 7.2 进程最大句柄数限制