一、事件发生经过
23年6月初,被告知生产环境提供接口服务的应用程序C告警,需要立刻前往现场解决。
抵达现场,登录linux应用服务器,开始分析C症状:
1、查看CPU和内存:TOP,使用率均不高,排除内存溢出;
2、查看进程:ps -ef|grep tomcat,进程仍在,应用程序没挂;
3、查验网络与端口,ping xx.xx.xx.xx,可以ping通;telnet xx.xx.xx.xx 10101,不通,初步确认应用程序处于假死状态;
4、查验线程状态,jstack -F tomcat进程号 >> jstack.txt,发现总线程数只有20多,90%以上是BLOCKED(阻塞)状态,线程阻塞,请求交易进不来所以引起了假死;
5、查看日志,可能是catalina.out日志太大了,当时没找到报错日志,自我批评下:我是个坑。。。;
由于事件紧,沟通后采取重启操作,先恢复业务后面再详细分析和解决。
二、接下来的N次重启。。。
当天上午重启后,正常恢复了业务,下午又告警,如此反复好几次,由于笔者水平有限当时
并没有给出可行的解决方案,运维老师建议新增启动参数“-XX:+UseG1GC”,
最终catalina.sh脚本,JAVA_OPTS参数追加了以下配置:
-Xms4096M -Xmx4096M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+UseG1GC。
重启后问题似乎解决了,近十天没有再出现问题,但是大家对这种表面的平静持警惕态度,
当然这期间我也没闲着。距离上次重启12、13天后,果然再次告警了,而且又是连续2次告警。
然后我把近期努力的结果告诉了负责人,需要改代码和配置,负责人同意,要求通过性能环境压
测后走上线流程。
三、发现与解决
1、调整应用程序线程池
测试环境使用40并发压测,生产环境问题复现,然后查找到了报错日志!!!见下图:
然后是根据服务器配置情况(32C),经过不断调试,最终确认核心线程10,最大
线程200,另外加上了拒绝策略,见下图:
2、调整tomcat配置文件server.xml
排查问题过程中发现server.xml没有配置线程池,连接器配置的是HTTP1.1,修改配置,见下图:
3、调整数据库连接池
压测过程中,发现有时会提示无法从连接池获取空闲连接,于是增加了连接数,如下图:
4、调整JVM参数
在优化的过程中,发现了前辈的文章:(29条消息) Tomcat 调优及 JVM 参数优化_tomcat设置jvm启动参数_ldongxu的博客-CSDN博客
加以借鉴,根据服务器配置,调整了JVM参数,见下图:
5、oracle表结构调整
查询接口内查询sql,表数据量在数十万以上,发现没有索引,于是查询关键字段新增索引。
最后附上一张120并发用户,120 TPS连续压测12小时的结果结束本次调优过程。