目录

 [隐藏] 

  • 1 背景

  • 2 系统文件数限制

    • 2.1 相关的配置


背景

工商总局公示系统的前台业务系统用到tongweb中间件,业务运行期间java进程报出打开文件数过多的问题,修改了/etc/security/limits.conf中的打开文件数限制如下:

 *    soft  nofile    65535
 *    hard  nofile    65535

退出登陆后,重新登陆,再用ulimit -a查看,发现65535的修改并未生效, 在网上查找资料后,得知需要修改ssh配置

 vi /etc/ssh/sshd_config
 UseLogin yes

重启ssh服务

 /etc/init.d/ssh restart

再次登陆用ulimit -a查看,发现65535的修改生效。
修改后java进程仍然报出打开文件数过多的问题,此时实际的打开文件数在4279个左右,经过排查,发现在Systemd中设置最大打开文件数与SysV的系统下有所区别,需要修改/etc/systemd/system.conf 和 /etc/systemd/user.conf两个文件都添加如下内容

 DefaultLimitCORE=infinity
 DefaultLimitNOFILE=65535
 DefaultLimitNPROC=65535

重启系统,然后再查看如下信息:

 cat /proc/[PID]/limits

此时java进程的最大打开文件数为65535,java进程也不再报打开文件数过多的问题。

系统文件数限制

相关的配置

1、/proc/sys/fs/file-nr是系统当前打开的文件数,是一个只读的参数
2、/proc/sys/fs/file-max指定了系统范围内所有进程可以打开的文件句柄的数量限制,修改方法如下:
临时调整file-max:

 echo  6553560 > /proc/sys/fs/file-max

永久调整file-max:

 vim /etc/sysctl.conf, 
 fs.file-max = 6553560

重启生效

3、ulimit是bash内置命令,提供了对shell及该shell启动的进程的可用资源控制,资源限制的配置可以在 /etc/security/limits.conf 设置,示例如下:

 *    soft  nofile    65535
 *    hard  nofile    65535

4、Systemd下的最大打开文件数设置

在Systemd替代了之前的SysV后,/etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。对于systemd service的资源限制的配置如下:
全局的配置,放在文件 /etc/systemd/system.conf和/etc/systemd/user.conf

 DefaultLimitCORE=infinity
 DefaultLimitNOFILE=100000
 DefaultLimitNPROC=100000

查看一个进程的limit设置:

 cat /proc/[PID]/limits

针对单个Service,也可以设置,以nginx为例。编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:

 [Service]
 LimitCORE=infinity
 LimitNOFILE=65535
 LimitNPROC=65535

然后运行如下命令,才能生效。

 sudo systemctl daemon-reload
 sudo systemctl restart nginx.service