最近发现线上一个部署在windows实例上的客户端服务占用CPU在70%~80%,造成本机卡顿。
排查过程如下
环境:
Windows2007版
JDK-1.8
Tomcat版本8.5.34(springboot版本2.0.5)
根据服务PID查找占用进程最高的线程:
查找具体线程信息可查阅:windows中查看CPU占用过高的线程
经排查,以下三个线程占用cpu达到了60%
线程信息如下:
如上图所示,占用cpu较高的线程均为NIO线程,去查看了很多由于tomcat版本造成CPU过高的相关博文。
记一次tomcat版本问题导致CPU超过100%
Java NIO浅析
apache-bugzilla-60030
断网故障时Mtop触发tomcat高并发场景下的BUG排查和修复(已被apache采纳)
等。
原因可能是windows环境下,JDK1.8+tomcat8.5.34版本中有NIO-bug问题。
博文汇总有以下处理方案:
- tomcat版本升至8.5.5
- 从NIO模式切换为NIO2模式
均不适用于我们的情况,无法处理CPU过高的情况
最终处理方案:
限制该Java服务对CPU的使用率 + 设置该服务的JVM参数。
JVM参数如下:
-XX:MetaspaceSize=200m
-XX:MaxMetaspaceSize=400m
-Xmx1000M
-Xms1000M