记一次服务cpu爆高异常

Bertha 。 2022-01-23 04:43 477阅读 0赞

image

这几天进行架构整改,将业务服务话,然后单独部署,但是有一台服务的运行时,cpu特别高,基本都是90%以上,导致服务的消费能力特别差。这种级别bug,简直是一种噩梦,但还是必须得解决。

发现问题:

1.服务部署到linux之后,通过top命令观察服务的cpu和内存使用情况

image

我们可以很明显的看到,在java进程中cpu使用率超级高,所以我们需要进一步的排查,是java进程中哪一个线程导致cpu如此高负载的。

2.通过如下命令,我们可以查看java进程是因为哪一个线程引起的。

  1. ps -mp 23615 -o THREAD,tid,time
  2. printf "%x\n" 线程号
  3. jstack 进程号|grep 16进制异常线程号 -A90

image

我们可以很明显的看到,最耗费性能的是gc垃圾回收线程引起的,这说明jvm在垃圾回收可能很频繁。

3.通过命令查看jvm垃圾回收情况

  1. jstat -gc 2592 5000

image

通过命令,我们可以很明显的看到YGC都没发生,FGC一直在叠加,说明老年代回收频率特别高,这也是cpu爆高的最终原因。

解决方案:

既然问题已经找到了,那我们应该如何解决呢?

从上面的问题可以得出应该是jvm参数配置有误,导致频繁的full gc,新生代回收基本没用到,所以我们需要调整jvm的参数,让full gc少发生,新生代得到充分使用,从而降低cpu占用率。

下面是博主我针对上面的问题,调优而成的配置:

  1. -Xmx3000M
  2. 最大堆内存
  3. -Xms3000M
  4. 最小堆内存
  5. -Xmn600M
  6. 年轻代大小
  7. -XX:PermSize=500M
  8. 设置持久代(perm gen)初始值
  9. -XX:MaxPermSize=500M
  10. 设置持久代最大值
  11. -Xss256K
  12. 每个线程的堆栈大小
  13. -XX:+DisableExplicitGC
  14. 关闭System.gc()
  15. -XX:SurvivorRatio=1
  16. Eden区与Survivor区的大小比值
  17. -XX:+UseConcMarkSweepGC
  18. 使用CMS内存收集
  19. -XX:+UseParNewGC
  20. 设置年轻代为并行收集
  21. -XX:+CMSParallelRemarkEnabled
  22. 降低标记停顿
  23. -XX:+UseCMSCompactAtFullCollection
  24. FULL GC的时候, 对年老代的压缩
  25. -XX:CMSFullGCsBeforeCompaction=0
  26. 多少次后进行内存压缩
  27. -XX:+CMSClassUnloadingEnabled
  28. 垃圾回收会清理持久代,移除不再使用的classes
  29. -XX:LargePageSizeInBytes=128M
  30. 内存页的大小
  31. -XX:+UseFastAccessorMethods
  32. 原始类型的快速优化
  33. -XX:+UseCMSInitiatingOccupancyOnly
  34. 使用手动定义初始化定义开始CMS收集
  35. -XX:CMSInitiatingOccupancyFraction=70
  36. 使用cms作为垃圾回收,使用70%后开始CMS收集
  37. -XX:SoftRefLRUPolicyMSPerMB=0
  38. 每兆堆空闲空间中SoftReference的存活时间
  39. -XX:+PrintClassHistogram
  40. -XX:+PrintGCDetails
  41. -XX:+PrintGCTimeStamps
  42. -XX:+PrintHeapAtGC
  43. -Xloggc:log/gc.log

应用上述的配置,服务的cpu和内存占有率下降了一大截,稳定性也得到很大的提高,gc回收频率大大降低了。

备注:

因为上述截图,是配置生效之后的数据,所以可能不准确。 参考地址:https://www.cnblogs.com/zexu-cheng/p/5079826.html

想学习分布式、微服务、JVM、多线程、架构、java、python的童鞋,千万不要扫码,否则后果自负~

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnpoaXFpYW5nMDMxNg_size_16_color_FFFFFF_t_70

林老师带你学编程:https://wolzq.com

发表评论

表情:
评论列表 (有 0 条评论,477人围观)

还没有评论,来说两句吧...

相关阅读

    相关 cpu飙升问题排查

    前言 首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次yo

    相关 项目运行cpu处理

    第一次处理这种问题,新手不懂的从何下手走了不少弯路,记录一下,以后借鉴. 对于cpu运行过高的问题,首先要打印堆栈信息,和线程运行cpu使用情况:    1.打印堆栈信息:

    相关 服务cpu异常

    ![image][] 这几天进行架构整改,将业务服务话,然后单独部署,但是有一台服务的运行时,cpu特别高,基本都是90%以上,导致服务的消费能力特别差。这种级别bug,简直