阿里云服务器CPU满载排查解决教程
对于运维和开发来说,最让人半夜惊醒的报警短信,莫过于“您的云服务器 ECS 实例系统 CPU 使用率已达到 100%”。
CPU 满载意味着服务器的所有算力被瞬间榨干,紧接着就是网站卡死、API 响应超时、数据库连接爆满,整个业务陷入瘫痪。面对这种情况,新手往往手忙脚乱地去控制台重启服务器。重启虽然能临时救急,但如果没找到根本原因,5 分钟后 CPU 依然会重新飙到 100%。
今天这篇教程带你像一个经验丰富的老手一样,冷静、规范地排查并解决阿里云服务器 CPU 满载的问题。
第一阶段:误区排查与“看病”前的准备
在动手敲命令之前,先去 阿里云控制台 看一眼监控大盘,确认一个关键指标:基本型(T系列)的 CPU 积分。
如果你买的是阿里云的“突发性能型实例”(比如 t5、t6),这种服务器平时限制了基础 CPU 算力(比如只给 20%)。当你的业务超标时,会消耗“CPU 积分”来获得全额算力。一旦积分耗尽,服务器就会被强行“限速”,表现出来就是 CPU 锁死在某个低分位,系统卡得动弹不得。
解决办法: 如果是突发性能型实例积分耗尽,要么在控制台开启“无性能约束模式”,要么直接升级为“通用型”或“计算型”实例。
如果排除了硬件机型的限制,说明服务器内部确实有进程在疯狂吃算力,我们必须登进系统开始“捉贼”。
第二阶段:Linux 服务器 CPU 满载排查全步骤
Linux 服务器是 CPU 爆表的高发区,大部分是因为坏代码、高并发或者中了挖矿木马。
第一步:找出“吃”算力的罪魁祸首(top 命令)
使用 SSH 连上服务器,直接在终端输入全宇宙通用的命令:
Bash
top
进入交互界面后,按下键盘上的大写 P(Shift + p),让进程按照 CPU 使用率从高到低排序。
紧盯着前几行,观察以下三个核心字段:
- PID: 进程的身份证号,后面杀进程全靠它。
- USER: 哪个用户启动了这个进程。如果是 www 或 nginx,大概率是代码问题;如果是 root,且名字很奇怪,小心是木马。
- COMMAND: 进程的名字。
常见 COMMAND 嫌疑人分析:
- php-fpm、java、node、python:业务代码在跑死循环,或者高并发下数据库没加索引导致硬扛。
- mysql:数据库正在执行复杂的关联查询、全表扫描。
- kswapd0:系统内存不够了,正在疯狂把内存数据往硬盘的 Swap 分区里挪,导致 CPU 跟着一起飙升。
- kinsing、sysrv、一串随机乱码:恭喜,服务器被黑了,这是经典的挖矿木马。
第二步:深度剥离,看进程内部在干嘛
如果发现是自己的代码(比如一个 Java 或 PHP 进程)把 CPU 吃满了,光知道 PID 还不够,得知道是哪一行代码在作妖。
场景 A:Java 进程满载排查(经典面试与实战题)
假设满载的 Java 进程 PID 是 1234。
- 找出这个进程里最耗 CPU 的线程线程号(TID):Bashtop -Hp 1234 假设看到线程 1256 占了 90% 的 CPU。
- 把这个线程号转换成十六进制(因为 Java 堆栈里用的是十六进制):Bashprintf "%x\n" 1256 # 输出结果假设为: 4e8
- 用 jstack 工具把 Java 的线程堆栈打印出来,用 grep 抓取那个十六进制的线程号:Bashjstack 1234 | grep -A 20 "4e8" 屏幕上会直接显示出哪一个类、哪一行代码(比如 com.xx.service.impl.OrderServiceImpl.lambda$0(OrderServiceImpl.java:88))正在运行,死循环一目了然。
场景 B:MySQL 导致 CPU 爆满
如果是 mysql 进程排在第一。立刻登录数据库执行:
SQL
SHOW FULL PROCESSLIST;
查看当前正在执行的 SQL 语句。重点看 Time(执行时间)最长的那些语句,如果看到大批 Selecting 状态且没有走索引的烂 SQL,直接通知开发加索引,或者让 DBA 临时把这条烂 SQL 杀掉。
第三步:果断处置(如何优雅地收尾)
情况一:普通代码死循环
如果影响到了生存,可以先用 PID 把进程杀掉换取喘息时间:
Bash
kill -9 进程PID
然后赶紧去改代码 Bug。
情况二:中了挖矿木马
黑客通常会挂定时任务,你单纯 kill -9 它是杀不死的,一秒钟就会复活。
- 检查定时任务:crontab -l,发现有奇怪的下载脚本,立刻用 crontab -e 删掉。
- 检查残留进程并杀死。
- 终极武器: 如果木马大面积感染,最快且最干净的解决办法是“利用快照恢复系统”,或者参考前文直接重装系统。
第三阶段:Windows 服务器 CPU 满载排查全步骤
Windows 服务器相对直观,直接通过图形界面解决。
第一步:打开任务管理器
- 远程桌面连接进服务器。
- 右键点击底部任务栏,选择 任务管理器。
- 点击 CPU 列的表头,让它按使用率从高到低排序。
第二步:深入资源监视器
任务管理器有时候只能看到 w3wp.exe(IIS 进程)或 sqlservr.exe 很高,看不到细节。
- 在任务管理器底部,点击 打开资源监视器。
- 切换到 CPU 选项卡。
- 在这里你能看到每个进程的具体服务。如果是 w3wp.exe 飙高,说明是 IIS 上的某个网站代码有问题,可以通过 IIS 的“工作进程”查看具体是哪个网站的哪个 URL 在疯狂消耗资源。
第四阶段:预防胜于治疗——如何防止 CPU 再次打满?
把这次火灭掉之后,为了以后不半夜惊醒,你必须搭好三道防线:
- 在阿里云控制台配置“CPU 报警规则”:进入 云监控 -> 应用分组 或 主机监控。给服务器加一条报警:当 CPU 使用率 >= 85% 持续 5 分钟时,立刻往手机发短信/钉钉报警。在它到 100% 之前提前介入。
- 数据库加行“慢查询日志”:开启 MySQL 的 slow_query_log,把执行时间超过 1 秒的 SQL 全部记录下来。每天去下发给开发优化,把隐患消灭在萌芽状态。
- 代码层设置超时机制:无论是外部 API 调用、复杂的循环还是多线程,都要设置最大超时时间。别让一个死循环无限期挂起消耗算力。
总结
排查 CPU 满载就像抓小偷:先用 top / 任务管理器锁定嫌疑人(PID),再用 jstack / PROCESSLIST 拿到犯罪证据(哪行代码/哪条SQL),最后果断处置并加装监控报警。
遇到问题千万别慌,按照标准流程层层剥离,任何让系统卡死的烂代码或木马都无处遁形。

