内核参数fs.file-max 指定了系统范围内所有进程可打开的文件句柄的数量限制。 合理值计算方法:取决于内存,每 1M 内存可增加 100 个。默认情况下,不要将超过 10% 的内存用于文件。将文件句柄数设置太大的危害是,当大量的文件句柄都为 sockets 时,会占用大量的内存,这些内存都是不可交换的。要记得的是网络套接字连接符也是文件。对于百万级连接数的进程来说,要设置单个进程可打开的文件句柄数为百万个。 比如 256G 内存,应该配置的值为:256*0.1*1024*100=2621440
设置方式:
vi /etc/sysctl.conf
fs.file-max = 2621440
#生效
sysctl -p
#通过命令也可以直接更改sysctl.conf文件
sysctl -w fs.file-max=2621440
内核参数fs.nr_open 指定了单个进程可打开的文件句柄的数量限制。nofile 可设置的上限受 fs.nr_open 的限制,不可超过 fs.nr_open 的值。nr_open 的默认值为 10485761024*1024,这个值一般不用更改,对于百万级别的单进程最大文件句柄打开数应该也够,nofile 基本不会超过这个值。
内核参数fs.file-nr 可以查看系统中当前打开的文件句柄的数量。 它里面包括 3 个数字: 第一个表示已经分配了的文件描述符数量,第二个表示空闲的文件句柄数量(待重新分配的), 第三个表示能够打开文件句柄的最大值(与 fs.file-max 一致)。
单个进程实际能够打开的最大文件句柄数量为ulimit -n,默认为1024 个。
针对单个进程实际可打开的最大文件数的限制,在/etc/security/limits.conf 中对应 nofile,需重新登录生效。
vi /etc/security/limits.conf
* hard nofile 100000
* soft nofile 100000
用通配符*表示所有用户,有些系统中可能不支持通配符*,此时应该为具体的用户进行配置。当超过soft 软限制时,会产生 warning 告警,但不可超过 hard 硬限制。 此外,要注意的是,pam_limits 模块会先读/etc/security/limits.conf,如果/etc/security/limits.d/目录下还有配置文件的话,也读进来,一起分析。这就意味着/etc/security/limits.d/目录下的配置会覆盖/etc/security/limits.conf 中的配置,这就是在 limits.conf 中配置了限制后,发现不生效的原因,所以如果 limits.d 目录下有配置文件的话,建议将其中的相关配置注销掉。 此外,不可以将 nofile 设置为 unlimited,因为/etc/pam.d/system-auth 中有 pam_limits.so 的限制,要求/etc/security/limits.conf 中定义的文件句柄数限制不可以超过 nr_open,否则拒绝 SSH 登录。
要注意以下几点:
对于通过ssh tty 登录后,手工启动的程序而言,受当时该登录用户的 ulimit -n的值所限制。
在limits.conf 中配置的限制,对当前正在运行的程序无效。
/etc/security/limits.conf 是 pam_limits.so 的配置文件,一般只有在“login”的时候才执行。
当遇到系统重启的时候,在limits.conf 中做的限制对程序无效。
将临时配置命令写入到rc.local 文件中:
vi /etc/rc.local
ulimit -SHn 100000
修改⽂件句柄数不⽣效的处理⽅法
问题发现:
当通过SSH登录时,使⽤ulimit -a命令查看当前⽂件句柄数发现最⼤可⽤的⽂件句柄数为1024(默认值)。但通过su切换到另外⼀个⽤⼾后,查看当前⽂件句柄数则为100000.
解决办法:
1、修改配置⽂件 /etc/ssh/sshd_config(问题所在,没有开启pam认证)
UsePAM yes
2、修改配置⽂件/etc/pam.d/password-auth(SSH登录加载这个⽂件)
session required pam_limits.so
3、修改配置⽂件/etc/pam.d/system-auth(su切换⽤⼾时加载这个⽂件)
session required pam_limits.so
在/etc/pam.d目录,存放了pam配置文件,常见如下:
login:用户通过终端登录时使用的pam配置文件
sshd:用户通过ssh远程登录时使用的pam配置文件
su:用户通过su切换用户时使用的pam配置文件
sudo:用户通过sudo,以其他用户身份执行命令时的配置文件
"session required pam_limits.so"配置经常放在password-auth和system-auth,然后被其他配置文件include进来。