java.net.SocketException: Too many open files排障分析
问题:业务组件,有个组件日志,显示 请求异常java.net.SocketException: Too many open files,看上是去是文件句柄数问题,但是系统已经设置过,难道没生效?
说明:系统CentOS Linux release 7.4,组件是通过systemctl方式启动的
1、先查看系统总的文件句柄数
cat /proc/sys/fs/file-nr
# 第一个数为已分配的文件数,第二个为未分配文件数,第三个为最大打开文件句柄数
这个显示是正常的,未超
2、然后查了下 ulimit -a
open files (-n) 65536
也没什么问题
3、查看 /etc/security/limits.d/20-nproc.conf
* soft nproc 32000
* hard nproc 32000
4、查看我这个组件当前实际进程数
lsof -p PID |wc -l
发现是四千多
5、查看 /proc/进程PID/limits
这时,才发现,原来系统配置的,未生效,最大才4096
最终问题就是在这,通过systemctl启动的service,未能加载/etc/security/limits.d/20-nproc.conf 下的配置
解决办法:
1、直接解决,验证有效
在组件的service文件上,加上LimitNOFILE参数
[Unit]
Description=xxxxxxx组件名
After=syslog.target
[Service]
.....................
LimitNOFILE=1024000
[Install]
WantedBy=multi-user.target
然后重启服务
2、修改/etc/systemd/system.conf(未实测,因要重启服务器)
/etc/systemd/system.conf 添加如下2个参数
DefaultLimitNOFILE=1024000
DefaultLimitNPROC=1024000
以上,就是因systemctl配置文件句柄不生效总结的结果
评论