问题场景
在某一时刻,某个微服务的某个实例 CPU 负载突然飚高:
同时建立了很多数据库链接:
其他实例没有这个现象。
问题定位
由于建立了很多数据库链接,猜想可能是数据库比较慢,查看数据库这段时间的 SQL 统计,发现数据库并不慢:
其中这个微服务这段时间的热点 SQL,执行并不慢。那么问题出在了哪里呢?可能是由于 GC,可能是由于 safepoint,还有可能是获取锁时间过长(参考:Java 监控 JFR全解),我们 dump 一下 JFR 并查看其中的 safepoint,GC 以及 Monitor Blocked 相关事件。
首先查看GC,发现都是 Young GC, GC 暂停时间也可以接受。