怎么解决线上CPU100%的问题
背景
Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下几个步骤。
解决步骤
- 找到最耗CPU的进程
top - 找到这个进程中最耗CPU的线程
top -Hp ${进程的PID}
- 查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码
printf "%x\n" 2611
jstack 2601 | grep a33 -A 20
- 生成异常进程的dump文件
jmap -dump:live,format=b,file=./heapdump.hprof 32695 - 使用VisualVM查看
快速解决
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
chmod +x show-busy-java-threads
实例代码
public class CpuUseTest {
public static void main(String[] args) {
new Thread() {
public void run() {
int result = 0;
while (true) {
result++;
if (result > Integer.MAX_VALUE / 2) {
result = 0;
}
}
}
}.start();
}
}
编译
javac
执行
java 类名
打印堆栈信息
当然更常见的是我们对整个jstack文件进行分析,通常我们会比较关注WAITING和TIMED_WAITING的部分,BLOCKED就不用说了。我们可以使用命令cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c来对jstack的状态有一个整体的把握,如果WAITING之类的特别多,那么多半是有问题啦。