记-微服务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参数适当作出一些调整,争取达到一个最佳的状态。如果仍然无法解决问题的话,建议换电脑!

-------------------如有错误的地方,希望各位老司机可以指正!

经验分享 程序员 微信小程序 职场和发展