Linux HostName引发的BUG
场景描述
11月份我们进行了一次全项目迁移,总共30多台机器,其中在迁移JAVA项目群的时候发现同样的SpringBoot Jar包在原生产启动很快,把配置文件改成新环境IP整个启动过程居然需要2~3分钟,具体表现为SpringBoot 启动图标等一小部分日志输出很快,然后就没有日志输出,大概隔40秒继续输出一部分,再过1分钟全部日志输出完成,启动完毕后 程序访问等一切正常。
问题分析及排查
首先查看日志输出是否正常,除了输出日志时卡顿一切都正常没有报错,程序启动完成后功能测试也一切正常,于是开始分析是否因为执行启动脚本后操作系统原因导致线程启动慢,也使用了同事推荐提示的strace命令观察调用链的耗时,后来结合日志输出的情况否定了操作系统原因导致,因为执行启动脚本后立马就有一部分日志输出,说明java进程已经启动,肯定是启动过程中需要等待其它资源,常见的是等待IO结束,但程序启动并无大量IO操作,排除了IO等待的原因,思考无果后便开始在程序停顿的时候使用Jstack命令查看java线程栈信息,结果如下图程序一直卡在getLocalHostName的Native Method:
于是开始对比新环境和旧环境的HostName,果然新环境被网管改成了非localhost(网管有时候为了规范会改动hostName),并且没有把hostname加入本机hosts。
结果及解决
经过上面的分析和排查得出结果:SpringBoot项目启动时会去获取本机名,如果改动过HostName且未把HostName配置到Hosts则会等待超时(60s)后返回,程序没有报错,并且后续如果用到了getLocalHostName得方法时也会超时,知道原因后把改过得Hostname配置到Hosts中127.0.0.1 HostName后及恢复
注:版权所有转载请注明出处,作者:Ambitor