最近出现好几次容器重启的问题,发现是健康检查失败导致
查看附近日志,发现有很多各种错误打印:
慢查询:
2024-12-26 01:22:22 - [http-nio-80-exec-16] ERROR c.a.druid.filter.stat.StatFilter - slow sql 10583 millis. UPDATE dashboard_widget SET name=?,
2024-12-26 09:22:03.205
2024-12-26 01:22:03 - [http-nio-80-exec-16] ERROR c.a.druid.filter.stat.StatFilter - slow sql 3226 millis. SELECT id,name,organization_id,author_id,la
域名解析失败:
ERROR org.redisson.connection.DNSMonitor - Unable to resolve master.acucloud-test.ta8n0i.cnw1.cache.amazonaws.com.cn
o.netty.resolver.dns.DnsNameResolverTimeoutException: [/172.31.0.2:53] query via UDP timed out after 5000 milliseconds (no stack trace available)
2024-12-26 09:22:29.468
at java.base/java.lang.Thread.run(Thread.java:840)
ping失败:
- [redisson-timer-4-1] ERROR o.r.c.handler.PingConnectionHandler - Unable to send PING command over channel: [id: 0x2b12e1ac, L:/172.31.51.27:39048 - R:master.acucloud-test.ta8n0i.cnw1.cache.amazonaws.com.cn/172.31.11.242:6379]
[http-nio-80-exec-23] WARN o.s.b.a.health.HealthEndpointSupport - Health contributor org.springframework.boot.actuate.mail.MailHealthIndicator (mail) took 74022ms to respond
ERROR c.a.c.w.exception.BizExceptionAdvice - [exception]:class[org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler]-method[handle],An anomaly has occurred, described:[java.io.IOException: Broken pipe
[redisson-timer-4-1] ERROR o.r.c.handler.PingConnectionHandler - Unable to send PING command over channel: [id: 0x48522a32, L:/172.31.51.27:39102 - R:master.acucloud-test.ta8n0i.cnw1.cache.amazonaws.com.cn/172.31.11.242:6379]
根据上面的打印,看起来好像是IO或网络慢导致
根据慢查询日志查看sql,发现这些sql并无异常,单独执行也并不慢
根据ping失败,怀疑是容器网络有问题,经过确认发现网络也正常
排除了IO网络问题,那是不是cpu问题?
从cloudwatch的监控面板看,发现这段时间的cpu偏高,达到了85%,按照常理,cpu并未跑满,不应该导致健康检查失败
那是什么原因呢?
于是我们上了arthas,进去实时监控,等待一段时间后,果然出现cpu升高健康检查开始失败
此时发现有一个叫scheduling-1的线程cpu很高, 赶紧打印他的堆栈
通过堆栈找到对应代码,原来这是个用@Scheduled注解生成的定时器,查看代码发现里边有死循环
改掉这处代码后,问题解决。
回头再来思考几个问题:
为什么监控面板上看到cpu只有80%多?
这是因为aws的监控采集是1分钟采集一次,还未采集上来就已经挂了
为什么cpu高会出现上面的ping失败,慢sql的打印?
以慢sql为例,它实际上是通过AOP在客户端进行检测的,如果cpu调度不过来,就会造成检测的地方计算延迟变大,误判为慢查询。