服务器CPU飙到90%以上怎么办?三步定位法帮你快速排障
上周五下午四点,某电商客户的运维群炸了——服务器CPU usage冲到97%,网站响应时间从200ms飙到8秒,订单接口直接超时。运维同事第一反应是重启服务,确实压下去了,但两小时后老问题又来了。
这种情况太常见了。CPU飙高不是重启能解决的,关键在于找到根因。下面这套三步定位法,是我们在托管运维服务中反复验证过的排查路径。
第一步:用top找到"吃CPU"的进程
登录服务器先跑top命令,按P键按CPU排序。重点看两个值:一个是单个进程的CPU占用率,另一个是load average。如果某个Java进程吃了85%以上的CPU,八成是代码里有死循环或者GC在疯狂工作。
这里有个坑:top看到的是瞬时值,可能刚好错过了峰值。建议用pidstat -u 1 60连续采样60秒,拿到一分钟内的CPU均值,比top的一次性快照靠谱得多。
第二步:用strace和jstack钻进进程内部
找到目标进程后,如果是Java应用,用jstack -l PID连续打三次线程快照,间隔5秒。三次快照里都出现在RUNNABLE状态的线程,基本就是罪魁祸首。如果是C/C++程序,用strace -p PID -c看系统调用分布,哪个syscall耗时最长一目了然。
实际案例里,我们碰到过一个Spring Boot应用,CPU周期性飙到95%。jstack打出来发现是定时任务里在用Collections.sort排一个50万条的List,每次跑8秒。改成流式处理后再没复现。
第三步:检查系统级因素
有时候进程本身没问题,是系统层面在搞事情。检查三个点:第一,CPU亲和性是否被误设,用taskset -p PID看看绑定在哪个核上;第二,是否有大量上下文切换,用vmstat 1看cs列,超过5万次每秒就要警惕了;第三,确认是不是被其他虚拟机吵到,云主机环境下邻居效应很常见。
排查CPU飙高没有银弹,但三步定位法能覆盖80%以上的场景:先定位进程,再钻入内部,最后检查系统层。养成这个排查习惯,比无脑重启有效得多。