常见问题 1:CPU 利用率高
问题
CPU 使用率是衡量系统繁忙程度的重要指标,一般情况下单纯的 CPU 高并没有问题,它代表系统正在不断的处理我们的任务,但是如果 CPU 过高,导致任务处理不过来,这个是非常危险需要关注的。
CPU 使用率的安全值没有一个标准值,取决于你的系统是计算密集型还是 IO 密集型,一般计算密集型应用 CPU 使用率偏高 load 偏低,IO 密集型相反。
问题原因:
1、频繁 FullGC/YongGC
如何排查:
- 查看 gc 日志;
jstat -gcutil pid
查看内存使用和 gc 情况。
2 、代码消耗,如死循环,md5 等内存态操作
如何排查:
(1)arthas (已开源)
thread -n 5 查看 CPU 使用率最高的前 5 个线程进行分析
(2)jstack 查找
ps -ef | grep java
找到 Java 进程 id;top -Hp pid
找到使用 CPU 最高的线程;printf ‘0x%x’ tid
将线程 id 转化 16 进制;jstack pid | grep tid
找到线程堆栈;- 备注:输入 “
1
” 可查看每个 CPU 的情况,之前有团队遇到单个 CPU 被中间件绑定导致 CPU 飚高的情况。
常见问题 2:load
高问题
load 指单位时间内活跃进程数
,包含:
- 运行态线程:执行
Thread.start
进入runnable
等待 CPU 调度,如果 CPU 很忙会导致 runnable 进程数增加; - 不可中断态线程:不可中断态主要包含
网络 IO
、磁盘 IO
以及内核态的锁(如 synchronized)
等。