记一次使用Arthas排查:线上服务每次发版部署时,cpu飙高

问题定位参考文章:

阿里Java诊断工具 arthas - 排查线上环境内存使用过大、线程cpu使用率高问题_arthas排查内存高问题_小毕超的博客-CSDN博客

​​​​​【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大_牧小农的博客-CSDN博客_arthas 分析内存

1、遇到的问题

每次发版部署服务,线上服务器的cpu飙高超过100%

2、排查思路

找到一次服务发版的时候,利用公司提供的线上故障排查工具,其实是阿里开源的Arthas进行排查

原因:

     C2 Compiler线程 占用大量cpu

      热点方法会使用C2编译

Jdk8 默认开启分层编译

0:解释代码

1:简单C1编译代码

2:受限的C1编译代码

3:完全C1编译代码

4:C2编译代码

多数方法第一次编译级别是3(当然所有方法都是从级别0开始),如果方法运行的足够频繁,它就会编译成级别4

增加启动参数,输出编译、内联、codeCache信息到文件,分析编译日志

-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -XX:+PrintInlining -XX:+PrintCodeCache -XX:+PrintCodeCacheOnCompilation -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=/usr/local/discount.log

解决方案

  1. 提高年轻代内存,stg 占比提高到30%(4G*0.3),服务启动cpu利用率未见明显降幅
  2. 提高堆内存,stg 测试提高到6g,cpu利用率几乎下降一半(prd是ecs,stg是k8s,需要在线上测试)
  3. 增加c2编译器cpu个数,服务启动cpu利用率未见明显降幅
  4. 不提高内存,为了避免预热期间对线上请求的影响,可在服务启动后自建流量,预热完成后接入真实流量
  5. 最直接有效的方法是“预热(warm up)”:可以使用Jmeter等压测工具模拟线上访问流量,让C2 Compiler预先将热点代码编译成机器码, 减少对正式环境流量的影响。

解决方案参考文章:

​​​​​​jstack: Java占用高CPU分析之- C2 Compiler Thread_xiuson@TencentWesure的博客-CSDN博客_c2 compilerthread C2 CompilerThread9 长时间占用CPU解决方案_幸福丶如此的博客-CSDN博客_c2 compilerthread

C2 CompilerThread11引起的CPU较高分析_shuaisunny的博客-CSDN博客_c2 compiler

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值