linux cpu过高排查流程
CPU 使用率
- 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙
- 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙
- 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,说明系统与硬件设备的 I/O 交互时间比较长
- 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,表明系统发生了大量的中断
怎么排查 CPU 过高问题
使用 top 命令,查看系统相关指标。
top
top - 15:24:58 up 49 min, 3 users, load average: 0.36, 0.16, 0.09
Tasks: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 2.7 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995456 total, 745644 free, 124492 used, 125320 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 733004 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
925 root 20 0 574280 19516 6148 S 0.0 2.0 0:00.48 tuned
655 polkitd 20 0 612240 12220 4752 S 0.0 1.2 0:00.07 polkitd
657 root 20 0 626676 9208 7036 S 0.0 0.9 0:00.17 NetworkManager
1615 root 20 0 162232 6672 4900 S 0.7 0.7 0:12.43 sshd
653 root 20 0 168308 5180 3748 S 0.0 0.5 0:00.02 VGAuthService
654 root 20 0 273192 4880 3748 S 0.0 0.5 0:04.19 vmtoolsd
924 root 20 0 113004 4332 3296 S 0.0 0.4 0:00.00 sshd
1087 postfix 20 0 89980 4120 3112 S 0.0 0.4 0:00.00 qmgr
- 找到相关进程后,我们则可以使用top -Hp pid或pidstat -t -p pid命令查看进程具体线程使用 CPU 情况,从而找到具体的导致 CPU 高的线程
- % us 过高,则可以在对应 Java 服务根据线程 ID 查看具体详情,是否存在死循环,或者长时间的阻塞调用。Java 服务可以使用 jstack
- 如果是 % sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的
- 如果是 % si 过高,则可能是网络问题导致软中断频率飙高
- % wa 过高,则是频繁读写磁盘导致的。