zhmg23

我们是如此的不同

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配置文件句柄不生效总结的结果


评论