Linux 中CPU占用过高问题
在我们日常开发中常常会有一些CPU资源占用过高的问题,这些问题往往会导致我们系统运行的缓慢,甚至造成系统的奔溃,那我们如何进行这种问题的定位呢,本文将带你研究。
-
第一步查看系统进程,CPU资源占用情况
使用top和ps -aux --sort=-pcpu|head -10 命令查看一下进程和CPU
- top
- ps -aux --sort=-pcpu|head -10
-
定位问题线程
上一步我们可以或得系统CPU资源占用高的进程号pid
top -H p pid可以查看某个进程的线程信息:-H 显示线程信息,-p指定pid
发现CPU和内存都偏高的线程id(tid)
-
分析线程CPU占用过高的问题原因
-
输出线程ID的16进制 nid=0x+16进制线程id.
printf ‘%x\n’ 11222 #输出线程 ID 的 16 进制
-
定位线程出现问题的原因
jstack pid | grep ‘0x900’ -C 30 --color 打印某个 Java 线程的线程栈信息查看问题
-
如果线程数目过多,可能问题原因是线程的上下文切换导致的
-
通过vmstat命令来查看一下操作系统层面的线程上下文切换活动
cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。
-
pidstat 监控进程信息:
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
-
-
查看磁盘 df -h
-
查看内存 free -m
总结: 遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。\