Arthas 实践——生产环境排查 CPU 飚高问题

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 13:40 收到我们的生产环境服务器绿版 CUP 超负载告警通知。此时心里只有一个想法,重启大法好,马上登录服务器,执行 top 发现进程 30247 和 28337 占用 CPU 为 200 多和100 多基本占用了 4 核的 3 核,整个过程大概用时 30 秒,维护群依然很平静,运营的电话也没打过来,这时候我断定,这次问题应该影响面很小,用户可能也暂时没有发现,好吧,还有时间做排查。

作者 | 李昊(可以养肥)

【Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿

生产环境 CPU 告警:

 13:40 收到我们的生产环境服务器绿版 CUP 超负载告警通知。

1.png

此时心里只有一个想法,重启大法好,马上登录服务器,执行 top 发现进程 30247 和 28337 占用 CPU 为 200 多和100 多基本占用了 4 核的 3 核,整个过程大概用时 30 秒,维护群依然很平静,运营的电话也没打过来,这时候我断定,这次问题应该影响面很小,用户可能也暂时没有发现,好吧,还有时间做排查。

2.png

Arthas排查过程:

  • 开启 Arthas 工具找到对应的 30247 运单模块和 28337 支付模块,选择运单模块进入:
java -jar arthas-boot.jar

3.png

  • 执行 dashboard 命令,线程 35 和 12042 不正常 CUP 占用 49%:
dashboard

4.png

  • 执行 thread 35  thread 12042 定位代码行:
thread 35
thread 12042

5.png

  • 查看代码,业务需求为生成一个至少包含 2 个数字的随机字符串,我们使用的统一的工具类方法,该方法中先通过 UUID.randomUUID() 随机出一个 10 位的字符池,然后再从这个字符池中随机需要位数的字符串,如果随机出来的 10 位字符池中都是字母,则二次随机时候就会出现死循环,问题代码如下:
public static String getRandomStr(boolean numberFlag, int length) {
    String retStr = "";
    String strTable =
        numberFlag
            ? UUID.randomUUID().toString().replaceAll("-", "").substring(0, 10)
            : "1234567890abcdefghijkmnpqrstuvwxyz";
    int len = strTable.length();
    boolean bDone = true;
    do {
      retStr = "";
      int count = 0;
      for (int i = 0; i < length; i++) {
        double dblR = Math.random() * len;
        int intR = (int) Math.floor(dblR);
        char c = strTable.charAt(intR);
        if (('0' <= c) && (c <= '9')) {
          count++;
        }
        retStr += strTable.charAt(intR);
      }
      if (count >= 2) {
        bDone = false;
      }
    } while (bDone);
    return retStr;
  }
  • 线下模拟不到二万次 UUID.randomUUID() 前十位会出现一次全字母的情况。

6.png

  • 最终原因是死循环导致的 CPU 飚高,修复代码,增加是否都是字母的判断,第一次随机出来的 10 位字符池都是字母,则重新随机。

Arthas 常用命令:

安装

curl -O arthas.aliyun.com/arthas-boot…
java -jar arthas-boot.jar

基础命令

help——查看命令帮助信息
cat——打印文件内容,和 linux 里的 cat 命令类似
echo–打印参数,和 linux 里的 echo 命令类似
grep——匹配查找,和 linux 里的 grep 命令类似
tee——复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
pwd——返回当前的工作目录,和 linux 命令类似
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas 快捷键列表及自定义快捷键

jvm相关

dashboard——当前系统的实时数据面板
thread——查看当前 JVM 的线程堆栈信息
jvm——查看当前 JVM 的信息
sysprop——查看和修改 JVM 的系统属性
sysenv——查看 JVM 的环境变量
vmoption——查看和修改 JVM 里诊断相关的 option
perfcounter——查看当前 JVM 的 Perf Counter 信息
logger——查看和修改 logger
getstatic——查看类的静态属性
ognl——执行 ognl 表达式
mbean——查看 Mbean 的信息
heapdump——dump java heap, 类似 jmap 命令的 heap dump 功能

class/classloader相关

sc——查看 JVM 已加载的类信息
sm——查看已加载类的方法信息
jad——反编译指定已加载类的源码
mc——内存编译器,内存编译 .java 文件为 .class 文件
redefine——加载外部的 .class 文件,redefine 到 JVM 里
dump——dump 已加载类的 byte code 到特定目录
classloader——查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource

monitor/watch/trace相关

  • monitor 方法执行监控

monitor -c 5 demo.MathGame primeFactors

-c 5 未统计周期默认 120s

  • watch 能观察到的范围为:返回值、抛出异常、入参

watch demo.MathGame primeFactors “{params,target,returnObj}” -x 2 -b -s -n 2

-x 2 输出结果的属性遍历深度
-b 方法调用前
-s 方法返回后
-n 2 执行2次

watch demo.MathGame primeFactors “{params[0],throwExp}” -e -x 2

-e表示抛出异常时才触发

  • trace 方法内部调用路径,并输出方法路径上的每个节点上耗时

trace demo.MathGame run

Arthas 征文活动火热进行中

Arthas 官方正在举行征文活动,如果你有:

  • 使用 Arthas 排查过的问题
  • 对 Arthas 进行源码解读
  • 对 Arthas 提出建议
  • 不限,其它与 Arthas 有关的内容

欢迎参加征文活动,还有奖品拿哦~点击投稿

相关文章
|
3月前
|
设计模式 监控 安全
如何定位当生产环境CPU飙升的时候的问题
在当今的信息化时代,计算机系统在各行各业都发挥着重要的作用。然而,当生产环境中的CPU飙升时,系统性能会受到影响,甚至导致整个系统瘫痪。这不仅会对企业造成经济损失,还会对用户体验造成严重影响。因此,如何定位并解决生产环境中CPU飙升的问题,已成为众多企业和开发人员亟待解决的问题之一。本文旨在探讨如何定位生产环境中CPU飙升的问题,并提供相应的解决方案。通过了解CPU飙升的原因、定位方法以及解决方案,企业和开发人员可以更好地应对生产环境中出现的CPU飙升问题,提高系统性能和用户体验。
64 1
|
6月前
|
安全 Windows
一次简单的服务器 cpu 占用率高的快速排查实战
一次简单的服务器 cpu 占用率高的快速排查实战
|
4月前
|
Arthas 测试技术
Arthas排查生产环境CPU飚高问题
Arthas排查生产环境CPU飚高问题
Arthas排查生产环境CPU飚高问题
|
7月前
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
1271 5
|
2月前
|
监控 Java Linux
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
|
3月前
|
弹性计算 Linux 数据安全/隐私保护
Linux【问题记录 01】阿里云CPU使用率 100% ECS 同时连接数峰值 25k+ 问题排查无果(附阿里云重新初始化云盘详细步骤)
Linux【问题记录 01】阿里云CPU使用率 100% ECS 同时连接数峰值 25k+ 问题排查无果(附阿里云重新初始化云盘详细步骤)
90 0
|
5月前
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
267 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
6月前
|
Java 调度
CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
面试过程中,场景类的问题更容易检测出一个开发人员的基本能力。这不,有一位小伙伴去阿里面试,第一面就遇到了关于“CPU 飙高系统反应慢怎么排查”的问题?当时这位小伙伴不知从何下手。 今天,我给大家分享一下我的解决思路。
106 0
|
7月前
|
Java Linux
第二季:10.假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位【Java面试题】
第二季:10.假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位【Java面试题】
100 1
|
7月前
|
Java
CPU飙升排查
CPU飙升排查

相关产品

  • 云消息队列 MQ
  • 微服务引擎
  • 云消息队列 Kafka 版