各位,公众号好友久违了!笔者已经很久没有更新公众号,今天心情不错重新开启公众号文章更新,望大家见谅!
今天给大家带了了一篇weblogic中间件故障事件经历,那是在某年某月某日某时某分,突然电话响了瞄了一眼,看见那熟悉的号码,感觉不好会有紧急事件要发生了。是现场一线运维同事打过来的,最近几天系统的weblogic总是异常罢工总是反复重启。需要紧急去现场解决问题。
笔者以最快的速度叫了一辆车来到了现场,看见现场的兄弟们很无赖的看着我,专家,你总算来了。笔者一边听现场兄弟描述故障现象,一边开电脑准备连接现场环境。总算了解清楚现场情况,现在开始干活了。先登录weblogic控制台检查服务正常,但从日志中发现weblogic服务在半分钟后就自动重启成功。但如果频繁发生类似问题势必会给业务带来不良影响
现场环境是一套Weblogic HA架构,weblogic与DB都在同一台主机,一旦主机发生异常就会通过HA软件进行主备切换,接着HA软件就会自动拉起DB数据库和weblogic应用。而HA的自检机制是每隔1-2分钟去调用一次weblogic_auto.sh脚本来检查weblogic服务运行状态,一旦检查到weblogic其中一个进程服务失败就返回给HA的值是非0,脚本会有一次自动重启weblogic服务机会。如果这一次自动重启失败后,那就没有机会了,HA就会自动切换到备机。如下图是自检脚本操作流程:
从上面操作流程来看是没有什么问题,切入点回到日志中去排查
在故障时间点获取了domain中weblogic服务日志都有发现重启的迹象,现挑出其中一套环境的weblogic日志和weblogic自检启动脚本日志,针对这两个日志做出详细分析:
1)、我们在故障时间点2017-1-9 下午03时30分09秒,发现weblogic服务日志中有报错java.lang.OutOfMemoryError: unable to create new native thread,此错会导致线程无资源创建,会让weblogic服务hang,系统访问会变缓慢。这并不是导致weblogic服务致命问题。此刻weblogic服务已经异常了。
2)、在故障时间点2017-1-9 下午03时30分03秒,从weblogic自检日志中有发现HA进程调用weblogic_auto.sh status去自检weblogic的服务运行状态,但检查的过程中无法正常获取weblogic服务状态,也报了java.lang.OutOfMemoryError: unable to create new native thread。这个肯定不是巧合,发现指令执行失败返回来的值是不正常的,因此判定weblogic状态是异常。最终weblogic自检脚本发起weblogic服务重启指令,来重启weblogic服务,这才是问题的原因导致。
3)、在故障时间点2017-1-9 下午03时31分43秒,weblogic服务开始启动,最后在2017-1-9 下午03时32分10秒左右,weblogic服务启动成功。
最终总结通过上面的数据证据表明此次weblogic自动重启事件原因是java.lang.OutOfMemoryError: unable to create new native thread因内存溢出资源不足导致新线程没有资源可分配。HA进程会每隔1-2分钟去调用weblogic_auto.sh来检查weblogic服务运行状态,脚本在获取状态异常报错(OutOfMemoryError),最后返回给HA是非0值,自检脚本会自动重启weblogic这个服务进程。所以排除操作系统kill weblogic服务进程。
针对此次事件总结优化建议如下:
1、建议调大JVM内存空间,基础上扩容1倍。
2、将当前HA架构改造成weblogic cluster模式,提升资源利用率,保障系统高可用。
3、在JVM虚拟机中增加内存溢出参数和增加的GC参数,有利于系统出现内存溢出方便内存故障排查问题分析。