正常在Linux下,对最多打开的文件描述符的限制设置有两个地方:
sudo sysctl -a | grep file-max 是全局最多可打开文件描述符设置
sudo ulimit -n 是单进程最多可打开的文件描述符设置
全局的修改比较容易,只需要在/etc/sysctl.conf中添加fs.file-max并指定值即可,如fs.file-max = 6553500。然后sysctl -p 生效。
可以用cat /proc/sys/fs/file-max, cat /proc/sys/fs/file-nr 查看。
单进程就比较坑了,我当前用的是Ubuntu 18.04,若仅是Server版本Ubuntu或是用SSH登陆的情况下,只需在/etc/security/limits.conf添加如下:
soft nofile 1024000
hard nofile 1024000
有时候 * 会没用,需要指定用户如: (ubuntu 有bug)
root soft nofile 1024000
root hard nofile 1024000
- 修改了/etc/profile
- 修改了/etc/security/limits.conf
改完之后,ulimit -n 查看。
但是一般改到这里,数据都是对的,但是实际运行还是上不去。此时要改PAM
[root@localhost ~]# cat /etc/pam.d/login |grep "pam_limits.so"
session required /lib/security/pam_limits.so
[root@localhost ~]#
查看pam_limits.so 已经在了。这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。
要是配置文件/etc/security/limits.conf配置立即生效,需要/etc/ssh/sshd_config里的UsePAM yes配置项,另外ubuntu有个bug,root用户必须注明用户,不能用通配符星号,(上面也写到了)然后重启sshd。