项目场景:

通过http请求获取源数据,然后处理数据存入数据库。


问题描述和定位:

由于本次解决问题,生产现场反馈的问题。无法得到想要的截图,基本通过语音沟通,询问问题情况,最后定位和解决问题。

1.报错

登录不上操作用户~

su 用户名

su: cannot set user id: Resource temporarily unavailable

2.查看用户连接数

切换root用户~

su root
#查看用户连接数
ps -u 用户 -L | wc -l

4145

3.查询系统给用户配置的最大连接数

cat /etc/security/limits.conf

...
用户 4098
...

到此就能知道了,问题的原因就是当前用户线程数超了。解决办法之一,修改用户进程数。

4. 暂时让他修改

vi /etc/security/limits.d/90-nproc.conf

用户  soft    nproc     9180

5.成功登录

su 用户

到此问题暂时解决了,但是并没有找到根本的原因~

6.查看当前用户下用户进程

发现进程(121823)不正常~(导致问题的进程)

ps -u 用户 -L 

在这里插入图片描述

7.查看进程(121823) 的用户线程数

一看吓一跳,就是你没错~

ps -u 用户 -L | grep 121823|wc -l

4037

而且还在一直增长中。。。

8.查看进程所属项目并关闭进程

显然这是一次,项目代码的问题导致的。而并非是用户部署项目过多或者其他原因导致的用户进程数不够的报错。


原因分析:

1.原因总结

整体基本已经明白,项目代码的某些问题导致linux用户进程一直创建且不销毁。而用户进程到达一定值时,就会被限制导致无法登录~

所以根本原因就是排查代码中的问题。

2.猜测可能

会不会是连接没有关闭导致的,于是就去看项目代码,寻找http工具类。
源码:

HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL.openConnection();
....
httpConn.close();

问题:

如果出现异常报错,则无法关闭httpConn.close()


解决方案:

修复代码问题,添加try catch finally 捕获异常并在finally里关闭连接。

再次打包部署,问题就解决了。

Logo

更多推荐