服务器CPU使用率90%以上时,先别慌,第一步是登录服务器确认CPU被哪些进程占用了,然后按“先隔离异常、再处理业务瓶颈、最后加防护”的顺序操作,大多数情况下几分钟内就能恢复正常。
服务器一旦CPU飙到90%以上,说明它几乎把所有算力都搭进去了,就像一个人从早到晚连轴转,随时可能崩溃,这时候首先分清是“正常的忙”还是“病态的忙”,直接决定了你要不要重启,下面这个排查思路,已经帮不少老运维解决过类似问题,你可以照着走一遍。
服务器CPU使用率90%以上怎么排查
别急着看一堆监控图,先登录服务器,在命令行里执行三件事,每一步都有明确目的,不要跳步。
第一步:用top命令看清谁是“元凶”
执行 top,然后按 P 键让进程按CPU使用率排序,你大概率会看到两种情况:
- 一个或几个进程的CPU占用接近100%,比如java、php-fpm、mysql
- 每个进程占用都不高,但整体CPU依然爆表
如果属于第一种,记住那个进程的PID,接着看它是正常业务还是可疑程序,如果属于第二种,问题多半出在系统层面,比如中断风暴、内核模块异常,或者硬件故障。
第二步:用ps和lsof确认进程身份
拿到PID后,执行 ps -fp PID 查看完整启动命令,正常的业务进程路径清晰,/usr/bin/php-fpm 或 /usr/lib/jvm/java,如果看到一串乱码、 /tmp 目录下的脚本、或者名字带有随机数字的进程,基本可以认定是挖矿木马或恶意程序。
更彻底的检查是 lsof -p PID,看这个进程打开了哪些文件,如果关联到 /tmp、/dev/shm 等可疑目录,直接进入应急处理流程。
第三步:用vmstat区分CPU高是“真忙”还是“假忙”
执行 vmstat 1 5,观察 us、sy、wa 三列:
us高:用户进程在疯狂计算,属于业务或恶意程序消耗sy高:内核态占CPU,可能是系统调用频繁,比如大量网络连接或磁盘读写异常wa高:CPU在等磁盘IO,此时CPU使用率90%以上只是表象,真正慢的是磁盘
这一步很关键,因为行业共识认为,不少“CPU爆高”其实是被慢磁盘坑的。wa 超过一定比例,就得先查磁盘IO,而不是盯着CPU进程不放。
服务器cpu占用率高怎么快速降下来
确认清楚原因后,分场景处理,这里给你一套可复制的操作路径。
异常进程或挖矿木马
这类情况最常见,而且通常不用重启服务器,按以下顺序操作:
- 先执行
kill -9 PID强制结束异常进程 - 再到
/tmp、/var/tmp、/dev/shm目录下找可疑脚本和二进制文件,删除后清空相关计划任务 - 检查
crontab -l和/etc/cron.d/下的任务,挖矿木马最爱在这里写自启动 - 确认清理干净后,用
ps aux再扫一遍,看有没有“复活”的苗头
如果你不确定进程是否属于业务,可以先用 systemctl stop 服务名 或临时断开这个进程的网络端口,观察CPU是否下降,注意:不要在不做备份的情况下直接删除文件,先移到隔离目录,确认无影响后再删。
流量攻击导致CPU跑满
top 显示sys占用高,netstat -antp 里有大量SYN_RECV或ESTABLISHED连接,八成是被人打了,服务器cpu使用率突然升高,很多都是这个原因。
处理方式:
- 在防火墙层面先限速,
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT,限制单IP连接数 - 如果业务在云上,尽快开启云服务商的高防或CDN清洗
- 临时修改SSH端口和数据库端口,避免核心入口被打满
- 不要裸奔硬扛,流量攻击根本不是靠优化代码能解决的
业务本身的高并发请求
这是“幸福的烦恼”,但CPU扛不住就会伤到业务,这里有两个思路:
短期降载:重启PHP-FPM或Apache,能有效释放堆积的连接数。systemctl restart php-fpm,但治标不治本,高峰期可能会再次爆高。
长期优化:在应用层加缓存,比如Redis;在接入层加队列,比如RabbitMQ;在服务器层加弹性伸缩,比如云上按需扩容,把一次性的高并发拆成可消化的请求,CPU自然就降下来了。
服务器cpu使用率90%以上会死机吗
很多朋友担心这个问题,明确说,短时间90%以上不会立刻死机,但长期这么高,系统会进入“假死”状态你敲命令都要等半天,远程连接频繁断开,甚至触发内核保护机制自动重启。
CPU使用率长时间维持90%以上,还会带来两个隐性风险:
- 温度升高,导致硬件寿命缩短,尤其在物理机房
- 其他重要进程拿不到CPU时间,比如监控agent、安全软件,反而是给攻击者留了门
遇到CPU爆表,宁可先业务中断几十秒,也要及时处理,好过硬扛到彻底宕机。
预防服务器CPU跑满的四个习惯
处理完眼前的危机,还得防着下次再发生,下面四件事是很多运维老手一直在做的基础工作。
配置监控告警,别等用户先发现
给CPU使用率设置阈值告警,比如当连续5分钟超过80%就发送告警,工具上用自带的Zabbix、Prometheus,或者云控制台的云监控都行,告警规则不用太复杂,有一个就行但一定要有。
定期检查代码层面的浪费
业务代码里最常见的CPU杀手是死循环、频繁创建大数据结构、无索引数据库查询,对于MySQL,慢查询日志能直接告诉你哪些SQL在拖后腿,执行 SET GLOBAL slow_query_log = ON;,把超过1秒的查询记下来,一个个优化。
建立应急处置SOP
把本文的排查步骤写进你的运维手册,明确谁负责登录服务器、谁负责联系云服务商、谁负责通知业务方,别等事情发生后再查文档。
该花的钱要花
如果是稳定业务,别把预算全花在硬件采购上,优先考虑云上按需付费的弹性资源,高负载时段临时扩容几台机器,比等CPU爆了再人工处理划算得多。
服务器CPU使用率90%以上相关问题解答
服务器CPU使用率90%以上会影响网站打开速度吗?
会,CPU是处理请求的核心资源,从Web服务器接收请求到数据库返回结果,每一个环节都需要CPU参与,当利用率超过90%后,大量请求在队列里排队,表现为网站图片加载慢、接口超时、部分页面直接502,如果你在业务峰值时看到CPU居高不下,网站变慢是必然结果。
为什么服务器CPU占用率高但找不到具体进程?
这种情况通常有三个原因:一是操作系统层面的中断处理,比如网卡驱动出现大量丢包或重传;二是磁盘IO等待时间过长,CPU并没有真正用于计算,而是卡在等待状态;三是内核模块或虚拟化宿主出问题,解决办法是先用 top 看 wa 和 si 列,再用 iostat -x 1 查看磁盘 %util,最后检查网卡 eth0 的丢包统计,多数情况下,问题出在硬件或系统驱动层,而不是应用层。
如何防止服务器CPU使用率突然升高导致业务中断?
建立三层防线,第一层,在云平台配置自动扩容,当CPU使用率超过80%时自动增加临时实例,将新流量分摊过去,第二层,在应用入口配置限流,当并发超过设定值时直接返回“系统繁忙”,保护后端服务不被冲垮,第三层,每周检查一次计划任务和日志文件,避免日志涨满磁盘导致CPU异常飙升,做到这三层,即使业务突然爆发,服务器也能撑到扩容完成,而不会直接宕机。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/683269.html


