线上CPU飙高或者发生死锁应该如何排查,方法很多种,可以借助于arthas命令,也可以手动通过命令排查
1. 如何排查
1. top :找出CPU占比比较高的进程,得到pid
top 按照-M -P, 内存和CPU使用率排序,也可以-H
2. jstack pid > show.txt, jstack命令保存一个进程中线程的状态
或者也可以jstack pid | grep 转换后的十六进制 -c5
打印栈的前后5行,会自动的把你的死锁信息打印出来的
3. top -Hp pid, 得到线程号,
printf "%x" 23265 得到线程号的16进制,或者查看网址https://tool.lu/hexconvert/
4. 在show.txt文件里面搜索线程号的16进制
2. 我处理过的具体实例
2.1 线上确实计算量大
线上的机器CPU升高,原本就很高, 首先top 命令查看,抓到cpu占比最高的java线程,然后top -Hp pid,进入看了一下,好几个线程CPU都高,结合业务数据量的猜想,应该就是机器负载过高导致的CPU过载
解决方案 限流、 升配、 扩容(由于我们是消费的sls实例,数据只允许有4个分片shard,所以扩容不管用)、下实例来降低数据
3. arthas 排查命令
thread -n 3 -i 1000: 列出 1000ms 内最忙的 3 个线程栈
"thread2"为线程名称,在平时创建线程或线程池时请务必取一个见明之义的线程名称,方便排查问题;
prio=6:线程优先级,不用关心;
tid=0x0000000006540800:线程id,不用关心;
nid=0x2be4:操作系统映射的线程id, 非常关键,后面再使用jstack时补充。
waiting for monitor entry:表示线程正在等待获取锁
0x0000000006dbf000:线程栈起始地址
每10秒刷新一次,3次后停止 dashboard -i 10000 -n 3