记-微服务CPU100%排查之windows版
简述:
Spring Cloud项目其中某个服务运行几个小时后CPU无端端达到100%,但内存无异常。
环境:
1.硬件:AMD-R52500U处理器,Win10电脑
2.应用:共6个微服务,同时在一台电脑上启动,其中一个微服务出现cpu异常
3.服务:该服务包含redis、rabbitmq、七牛云
思路:
1.任务管理器:查看电脑整体情况,特别是CPU、内存使用情况。获取异常进程PID
2.Process Explorer:根据PID查询TID,TID即线程ID
3.jstack:利用jdk提供的堆栈分析工具查看异常线程详情
4.判断异常线程是否包含业务代码,如果包含,即编写的程序出现问题,修改即可(可以跳过以下步骤!)
5.SkyWalking:监控微服务情况,判断CPU的异常是否和GC垃圾回收有关联
6.jvisualvm+visual:jvisualvm是jdk自带的监控jvm工具,且装上visual gc插件,可以更加清楚新生代/老年代的情况
7.修改相关JVM参数,让服务正常使用CPU
1、任务管理器
步骤:
(1)查看占用CPU最高的进程
(2)详细信息里面调出进程PID
2、 Process Explorer
步骤:
(1)找到进程PID,右键properity->Threads,调出相关异常进程TID
(2)将TID转换为16进制,为接下来的jstack分析做准备,不懂的可以直接百度用转换器转换
3、jstack工具
步骤:
(1)jstack位于jdk的bin目录下,直接打开cmd或者直接用控制台打印
jstack 进程PID > 输出的文件路径
(2)找到tid,tid即对应线程的16进制位,找到之后就做业务分析,若无相关业务逻辑,就可以排除业务逻辑错误的可能了,进入下一步
4、Skywalking
简述:
Skywalking是一款无侵入式的监控工具,只需在微服务启动时加入代理的参数,即可对微服务进行监控
步骤:
(1)官网下载:
(2)应用服务启动:
-javaagent:D:apache-skywalking-apm-binagentskywalking-agent.jar -Dskywalking.agent.service_name=***-server
(3)Web监控地址:localhost:8080,分析异常进程
注:
在这里可以很清楚看到,服务young gc进行工作时,cpu的使用率几乎达到了100%,并且gc执行完毕了之后cpu还不释放,个人盲猜是-Xms设置太小了,即初始化的堆内存太小了,在gc收集完毕之后,内存还要进行动态伸缩,随后再次进行回收,如此循环往复,导致了cpu达到了100%,初步的解决方法就是将-Xms设置为与-Xmx相等,避免自动扩容所带来的的性能消耗
(最终这个方案经过实操验证还是无法解决问题)
5、jvisualvm
简述:
jvisualvm属于jdk的监控jvm工具,装上visual gc插件可以更加清楚了解到新生代/老年代的运行情况,进而作出更加准确的判断
6、解决方案:
操作:
将mq、redis、七牛云拆分为三个服务,但还是会出现问题,每个服务都会占用20%左右的cpu,而且JVM的Eden区以每秒20m的增速在增长,几乎每秒都会进行一次gc操作。由此可以看出redis、mq都比较耗cpu。
总结:
当CPU达到100%,一般可以分为两种情况,一种是程序bug,一种是硬件没有那么强大,可以给JVM参数适当作出一些调整,争取达到一个最佳的状态。如果仍然无法解决问题的话,建议换电脑!
-------------------如有错误的地方,希望各位老司机可以指正!