@auther 张念磊 @date 2020/7/25
一个服务上线生产之后两天出现了三次问题
详细征兆如下:
刚出现此问题时,浏览器的一个请求发过去,开发者工具network一栏显示该请求状态一直是padding,会持续几分钟。网关服务打印了对应的请求。后台服务只打印了controller中的日志,没有打印service层的日志(日志级别debug,服务正常时会打印service层的日志);通过重启服务可暂时解决该问题,不过一段时间后会复现。前提:近期用户增多,有49家机构在使用该功能模块。
服务器线程爆了:该服务器一共部署了31个微服务,还有一些对外提供的的其他服务,服务的总线程数量超过计算机的最大线程数量。服务器内存不够:服务器内存为32GB,现有未使用1GB(每个服务的运行内存设置为300M/512M/1G)。但服务日志没有爆出内存溢出异常,不能断定是该问题。编写的代码异常导致,但异常时服务不产生日志,无法定位问题。以前也会有此问题,程序异常,后台返回的异常原因是null,可能是该服务的config配置有误,没有准确捕捉并返回异常信息。log文件被锁住导致程序无响应。具体原因:应为项目中使用到了两种打印日志的方式,一是使用第三方的slf4j打印log;二是使用printStackTrace()函数打印日志
此次生产问题的原因:
日志文件被锁住了。printStackTrace()函数打印日志,和使用slf4j打印日志时对日志文件资源的抢夺,导致文件被锁住;启动类中捕获了异常但是没有打印异常目前的解决办法:启动类中添加异常信息的打印;删除代码中使用printStackTrace()函数的地方,改为使用slf4j打印log;
可用的其他办法:添加配置,在配置中设置只允许slf4j打印日志,不允许使用printStackTrace()函数打印日志。
本次排查问题用到的知识
先用 jps -l 查看应用的PID
jps -l查看该Pid(进程)下的线程数
ps -Lf {pid} | wc -l管道统计
| wc -lview jstack.log
这个问题算是解决了,但是我还是有几个好奇的地方:
如何定位到的问题?定位此类问题的思路和方法?jstack命令 如何使用?思路:
以jstack为突破点,了解一下java堆栈分析请教同事下一篇博客预告:
使用jstack定位问题原因
阿里巴巴的arthas是什么?如何使用它定位生产问题?