最近线上一个应用出现了一个 tomcat 无法加载,卡住了的问题。引起该问题的原因是开发同事的一个老项目新增了一些功能,需要进行上线,首先发布到预发布环境后,重起 tomcat,发现出现如下现象:
Oct 27, 2014 10:31:14 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-9009"]
Oct 27, 2014 10:31:14 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 586 ms
Oct 27, 2014 10:31:14 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Oct 27, 2014 10:31:14 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.40
10:31:20,011[INFO]MLog:80 MLog clients using log4j logging.
即 tomcat 的日志显示,走到 MLog clients using log4j logging
这就不往下走了。
虽然我的预发布环境没有做任何变更,但是为了稳妥起见,还是把代码在生产集群中的其中一台服务器发布下,结果表现的现象是一样的,还是加载不成功。
但是开发同事又说在测试环境是能正常加载的,为了证明不是环境问题,所以让开发同事先回滚代码,回滚后,再发布,能正常加载,所以我让开发同事排查下代码,看是不是代码有问题,因为开发同事上线了两个新功能,所以我让其把功能拆开了上线发布,结果是上线其中一个功能能正常加载,上线另外一个不能正常加载,那根据这个可以判断是另外一个功能的代码问题了。但是结果一天的排查,还是不能确定到底是什么问题。同时开放同事坚决表示测试和开发都没有问题,为什么就生产有问题。所以只好继续从环境入手了。
我最后让开发把测试环境的 tomcat 配置发给我看下,看是否不一致(最后才查看 tomcat 配置,是因为我们的环境 tomcat 类似的一直都是测试,预发布,生产保持一致的,所以当时没有想到这方面)。最后一对比发现,tomcat 配置的 -Xss
这个值不一样,预发布和生产的是设置的 256k,而测试环境是设置的 512k
,最后把测试环境的该值调小到与预发布环境一致。重显了该现象。因此确定问题,是开发新上线的代码线程栈用的太大,导致原先设置的不足,需要调大。最后把预发布和生产环境的 -Xss
调大后,问题解决。
注:运维问题真是不能想当然,要一步步的把所有的差异都对比,然后一一的修正测试。
参考资料: