问题描述:客户现场登录系统,每次都是5秒钟以后就显示用户登录超时,但是系统默认登录失效时间为20分钟。

刚知道问题的时候,首先就是查看用户系统部署环境,通过cat  /etc/issue 查看系统版本,显示用户部署环境为Centos7.2

打开文件过多 Java_重启

(该图片为模拟环境,版本为Red Hat 6.9)

因为前两天遇到了测试人员环境部署为Centos7.5系统有时登录不上去的问题,是通过关闭防火墙解决的(我们默认部署环境是通过Centos7.0镜像进行部署,该镜像经过特殊处理默认将firewalld防火墙关闭),所以第一反应就是防火墙没有关闭,所以执行 systemctl stop firewalld命令

打开文件过多 Java_linux_02

但是关闭防火墙以后,问题仍然存在,于是就去查询后台日志,后台日志反复出现一个错误,错误内容如下:

打开文件过多 Java_java_03

从报错信息中可以看出,说是java.io.FileNotFoundException,查了一下,文件真实存在,所以不是文件不存在引起的问题,然后看保存信息中涉及到我自己定义的类

打开文件过多 Java_java_04

然后就去看代码,代码如下:

打开文件过多 Java_打开文件过多 Java_05

代码中只是返回一个新建对象,该对象并不会涉及到对文件的操作,所以排除代码的问题。

错误信息中还有一个提示是打开的文件过多,根据这个信息,我猜测可能是java进程打开的文件过多,引起的原因可能是

1、用户数据量太大,造成数据库操作文件过多;

2、读写IO时没有进行关闭

于是我就首先通过ulimit -a命令,查看进程允许打开的文件数量,想修改一下文件数量,看是否能解决

打开文件过多 Java_打开文件过多 Java_06

通过查看,默认文件数量是1024,于是我通过  ulimit -n 5000 命令,将可打开文件设置为5000,发现问题依然存在

打开文件过多 Java_重启_07

把之前的情况都排除了以后,似乎就剩下唯一一个情况了,那就是IO存在问题了,然后我就通过lsof  -p  pid命令查看java进程打开的文件,然而令人奇怪的是,根本不存在某一个文件被打开了多次的情况,然后我瞬间就懵了,这是什么鬼??不应该啊。

打开文件过多 Java_cron_08

我又把我查找问题的流程重新走了一遍,发现没有什么疏漏啊,那问题到底出在哪儿。在整个流程走第二遍的时候,忽然间发现java进程ID变了,这是什么鬼,进程ID怎么也会变?于是我再次重新查看java进程,发现进程又变了,这java进程怎么一直在重启,经过询问实施人员,发现实施的时候遇到有一个需要使用的端口起不来,所以设置了一个定时任务。

打开文件过多 Java_打开文件过多 Java_09

发现该定时任务,是一分钟监控一下9999端口是否启动,如果没有启动,就重启java进程。于是定位问题应该就出在这里,然后将该定时任务删除以后,系统正常运行。猜测9999端口应该是在java程序启动以后还没有启动,或者说端口启动时间超过一分钟,所以就会有java进程的一直重启(该端口不是java启动所用端口)。

总结:

1、打开的文件过多不一定就是进程打开的文件过多,也有可能是某一个文件被打开的次数太多;

2、看似没有关联的东西,也许是引发问题的真正原因。