前言
收到告警信息:”10.XXX.XXX.XXX机器CPU占用过高,请立即查看排查,确认无误后关闭告警!“, 那 linux CPU占用飙升要如何排查定位呢?
自己简单规整了下,最基本的排查方式可以分为以下几步吧?
确认是程序性能问题导致,还是系统硬件瓶颈?
确认引发CPU飙升的进程,进程PID?
确认引发飙升进程下哪个线程CPU占用率较高?
jstack打印进程下全部的线程堆栈信息,查找CPU占用较高的线程的堆栈详情信息?
根据第四步的堆栈信息,确定出现问题的代码行号,对比程序,修改优化程序。
如何确认是程序性能问题导致,还是系统硬件瓶颈?
个人习惯的做法是,使用先vmstat查看CPU负载情况:
vmstat : 查看系统维度的CPU负载
// 每间隔1秒钟打印一次系统维度的CPU复杂情况
vmstat -n 1
image.png
返回结果中的主要数据列说明:
r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。
us:用户模式消耗的 CPU 时间百分比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。
sy:内核模式消耗的