两台负载均衡的ECS服务器相继宕机原因排查
事故发生在今天中午业务高峰期过后,两台负载均衡的服务器前后2分钟都宕机了。
为什么两台机器会同时宕机呢?猜测可能的原因:
- 来自外部攻击
- 业务系统某功能编写不合理,访问数据量过大
- 数据库访问连接过多,造成系统无法响应
先排查第一个原因,查看ARMS,有很多对 /hwmarket/api/storeApi
的 POST 请求,而且就在故障前几秒钟,还有大量的这个请求。
查看两台服务器在发生事故时,CPU都达到了95%以上,内存曲线变化不大,ECS连接数也没有明显增加。
查看Tomcat访问日志,2台机器的 localhost_access_log 日志,两台机器在发生故障时都无法没有请求进来了
虽然请求数量多,连接数并没有突增,因此不太像造成宕机的原因。
接着排查第二个原因,查看业务日志,发现其中一个api中存在每隔3秒钟一次的交易记录查询,这个大概是前端业务逻辑的问题,频率也不高,不太可能造成2台机器同时宕机啊
排查第三个原因,查看了数据库的各项指标,都正常的,没有明显波动。
冥思苦想,不知道问题出在哪里,这个时候在查看调用链时,以外发现 GC 回收有异常
此时再去看 JVM监控,发现一台机器的 Full GC 达到了 432 次,耗时 7.8 min;另外一台 Full GC 达到了 26 次,耗时 39.8 s。
这应该就是导致CPU过高的主因了。
但是为什么会有这么多次的内存回收呢?原因时两天前ECS做了降配,由原来的4核8GB,降到了2核4GB。内存不够用,导致了频繁的内存回收。
以后在降配后要多关注服务器的日常运行指标数据,做到及早发现和处理。