目录
前言
项目采用的是springcloud微服务框架,注册中心选用nacos-1.0.0版本,在项目版本迭代过程中突然出现问题,项目持续运行过程中,出现某个工程查询全部中断,项目从注册中心下线的问题;通过问题定位发现,此项目中存在cpu占用超100%的线程;
问题定位
项目所有接口报500错误,通过top命令查看到498526进程CPU占用100%,通过jps -ml发现此进程是项目中的某个微服务进程,初步定位到时此微服务出了问题
查看这个进程中所有线程的资源使用情况,执行top -Hp 498526,结果如下;找到cpu占用100%的线程id是498599
拿到问题线程的线程id之后,去获取该线程的堆栈信息,首先将线程id转换为16进制,执行 printf "%x \n" 498599 的到线程id的16进制编码79ba7,然后通过jstack 498526 | grep '79ba7' -A10命令去查看该线程的堆栈信息如下;发现此线程一直在执行GC操作,那么问题原因就是该线程,中存在释放不掉的大对象,导致一直GC,CPU专用100%,从而拖垮该微服务;
那么,接下来的工作就是查看该进程的dump文件,分析到底是哪个类导致大对象的持续产生又无法被GC回收,执行jmap -F -dump:format=b,file=498526.dump 498526, 使用-F是强行挂起导出命令,避免cpu占用过高报错。
查看dump文件看出,是nacos的ClientWorker类导致的问题。查看nacos的gc日志显示如下;自行搜索相关问题,得知nacos client 客户端存在cpu占用100%的问题,参考:Nacos client 客户端cpu占用100% 问题排查和解决方案
解决方案
升级nacos服务端与客户端版本到1.4.0
后记
本实践结合自身项目自身运行问题,对CPU飙升问题排除方案与技术进行了实践,效果明显;如果有兴趣交流知识图谱,请联系作者,见二维码,欢迎交流指正。