简介
linux最大打开文件句柄数,即打开文件数最大限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小1024)
为了防止失控的进程破坏系统的性能,Unix
和 Linux
跟踪进程使用的大部分资源,允许用户和系统管理员使用对进程的资源限制,
设置的限制有两种:硬限制
和 软限制
:
- hard:硬限制是可以在任何时候任何进程中设置 但硬限制只能由超级用户修改。
- soft:软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值。
(noproc)最大线程数和(nofile)文件数。
1 | # nr_open是单个进程可分配的最大文件数 |
在Linux下有时会遇到 Socket/File : Can't open so many files
的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈。
Linux资源的限制
登陆时限制
Linux对用户使用资源的限制通过 PAM 对登陆用户进行身份验证并设置相应的限制。
具体顺序如下。从用户登陆开始,操作系统会依次执行如下三部
- /etc/pam.d/login
- /etc/pam.d/system-auth
- /lib64/security/pam_limits.so
1,/etc/pam.d/login 中调用system-auth
1 | cat /etc/pam.d/login |
2,在/etc/pam.d/system-auth 调用 pam_limits.so
1 | /etc/pam.d/system-auth |
3,通过grep查看 /lib64/security/pam_limits.so 可以看到 limits.conf和limits.d/*.conf
1 | grep -a "/etc/security/limits." /lib64/security/pam_limits.so |
Centos7系统修改
在Centos7系统中,使用 Systemd
替代了之前的 SysV。/etc/security/limits.conf
文件的配置作用域缩小了。/etc/security/limits.conf
的配置,只适用于通过PAM认证登录用户的资源限制,它对 systemd
的 service
的资源限制不生效。因此登录用户的限制,通过 /etc/security/limits.conf
与 /etc/security/limits.d
下的文件设置即可。
对于 systemd service
的资源设置,则需修改全局配置,全局配置文件放在 /etc/systemd/system.conf
和 /etc/systemd/user.conf
。system.conf
是系统实例使用的,user.conf
是用户实例使用的。
1 | # vim /etc/systemd/system.conf |
reboot
重启后生效。
1 | [root@host-192-175-32-22 bin]# cat /proc/2789/limits |
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 | * - nofile 1048576 |
免密登陆
用户不会进行登陆验证过程,所以不会加载 limits.conf 文件,建议通过 /etc/profile
添加 ulimit -n 1048576
命令设置,重新登陆或者执行 source /etc/profile
命令,然后启动服务程序;
查看用户级的最大限制
ulimit -a
或者 ulimit -n
ulimit -n
,默认是1024,向阿里云华为云这种云主机一般是 65535。
1 | [root@host-192-125-30-59 ~]# ulimit -a |
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 | # 找到pid |
实例:
1 | [root@host-192-125-30-59 ~]# cat /proc/3289/limits| grep files |
ps:如果要查看某个进程的线程的详细信息,/proc/[pid]/task
修改用户级最大限制
临时生效方法:(重启后失效)
这个设置是暂时的保留。当退出Shell会话后,该值恢复原值。
1 | ulimit -SHn 1048576 |
ulimit
命令分软限制和硬限制,加 -H
就是硬限制,加 -S
就是软限制。默认显示的是软限制,如果运行 ulimit
命令修改时没有加上 -H
或 -S
,就是两个参数一起改变。
硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。
用户级修改永久有效方式
修改配置文件 vim /etc/security/limits.conf
,加入:
1 | * soft nofile 65535 |
或者使用命令:
1 | echo "* soft nofile 65535" >> /etc/security/limits.conf |
*
表示所用的用户,但有的系统不认, 需要具体的用户名, 比如:
1 | root soft nofile 65535 |
有些环境修改后,root用户需要重启机器才生效,而普通用户重新登录后即生效。
需要小心注意的是,有些环境上面这样做,可能导致无法ssh登录,所以在修改时最好打开两个窗口,万一登录不了还可自救。
修改系统级最大限制
其实上面的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。
假如,我们设置进程打开的文件句柄数是 1024 ,但是系统总限制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。
1 | # 系统级修改临时生效方式: |
查看系统级文件句柄修改,是否生效
1 | sysctl -p |
参考: