阿里云服务器CPU跑满排查是通过系统命令、监控工具和日志分析,定位占用CPU的进程、线程及底层原因并恢复负载的过程。

确认CPU负载状态
使用以下命令快速确认服务器是否出现CPU跑满以及负载压力。
uptime
输出示例:
10:20:30up10days,2:15,3users,loadaverage:8.52,6.10,4.33
负载平均值高于CPU核心数时,说明存在排队任务,例如4核服务器load average持续超过4,需要关注。
top
top界面中按P键按CPU使用率排序,查看%CPU列,观察是否有进程占用接近100%或多核占满。
mpstat-PALL15
该命令逐核显示CPU使用率,%usr、%sys、%iowait、%idle分别对应用户态、内核态、IO等待和空闲,iowait高,则问题可能在磁盘IO而非CPU计算。
vmstat15
关注r列(运行队列)和cs(上下文切换)、us、sy、wa,r持续大于CPU核数说明CPU饱和。
定位高CPU进程
通过进程级命令找到具体消耗CPU的进程。
psaux--sort=-%cpu|head-20
输出按%CPU从高到低排列,记录PID、%CPU、%MEM、COMMAND。
top-c
显示完整命令行,避免只看到进程名而无法区分多个同名进程。
pidstat-u15
按秒采样显示每个进程的CPU使用率,适合观察瞬时波动。
记录高CPU进程的PID,例如12345。
线程级定位
找到进程后,需要深入线程,因为单个进程可能包含多个线程,某个线程死循环也会导致整个进程CPU高。
top-H-p12345
显示该进程所有线程的CPU占用,找到最高线程TID,例如12346。
ps-mp12345-oTHREAD,tid,time
输出线程列表,确认TID和CPU时间。
将十进制TID转换为十六进制,用于后续日志搜索:
printf'%x\n'12346
假设输出303a。
按应用类型排查
Java应用
如果高CPU进程是Java应用,使用JDK工具。
jstack12345>jstack.log
在jstack.log中搜索十六进制TID303a,查看该线程栈,定位具体类和方法。
jstat-gcutil12345100010
查看GC情况,如果FGC频繁增加且GCT持续上升,说明存在频繁Full GC,可能导致CPU高,频繁GC常见原因:堆内存不足、对象创建过多、内存泄漏。
jmap-histo:live12345|head-50
查看存活对象直方图,列出占内存最多的类,帮助定位内存泄漏。
也可以使用阿里开源的Arthas:
java-jararthas-boot.jar thread-n3
直接输出最忙的3个线程栈,无需手动转换TID。
数据库服务
如果高CPU进程是MySQL/PostgreSQL等数据库,查看数据库内部线程。
SHOWFULLPROCESSLIST;
查看正在执行的SQL,关注Time长、State为Sending data、Sorting result、Copying to tmp table的会话。
SHOWGLOBALSTATUSLIKE'Threads_running';
查看当前运行线程数。
SHOWVARIABLESLIKE'slow_query_log';
确认慢查询日志是否开启,结合慢查询日志分析执行计划。
EXPLAINSELECT...;
分析SQL执行计划,检查是否全表扫描、缺少索引、索引失效。
如果是Redis,使用:
redis-cli--latency redis-cliinfocpu redis-clislowlogget100
查看慢命令和CPU占用。
Nginx/Web服务
如果高CPU进程是Nginx或Apache,查看访问日志和错误日志,定位异常请求。
tail-f/var/log/nginx/access.log
统计请求频率:
awk'{print$1}'/var/log/nginx/access.log|sort|uniq-c|sort-nr|head找出高频IP,可能面临cc攻破或爬虫。
awk'{print$7}'/var/log/nginx/access.log|sort|uniq-c|sort-nr|head找出高频URI,分析是否某个接口被大量请求。
系统级进程
如果高CPU进程是系统内核线程,如kswapd0、kworker、migration等,需检查内存、IO或硬件问题。
kswapd0占用高:物理内存不足,频繁换页,需要增加内存或优化应用内存。
kworker占用高:内核工作任务多,检查磁盘IO、网络、USB设备等。
软中断si高:网络包处理压力大,检查网卡流量和队列。
sar-nDEV15
查看网络接口速率。
iostat-x15
查看磁盘利用率%util和等待时间await。
排查恶意程序与入侵
CPU跑满可能是生产程序或恶意脚本,需检查计划任务、启动项和网络连接。
crontab-l ls-la/var/spool/cron/ ls-la/etc/cron.d/
查看是否有可疑定时任务。
systemctllist-unit-files--type=service|grepenabled
查看开机启动服务,检查异常服务。
ss-antp
查看已建立的网络连接,定位进程连接的外部IP和端口。
lsof-p12345
查看进程打开的文件和网络连接。
rpm-Va--nofiles--nodigest
校验RPM包完整性,发现被替换的系统命令。
如果确认是生产,处理步骤:
kill-912345 rm-f/usr/local/bin/可疑文件 crontab-r
删除恶意计划任务和启动项,必要时应重装系统并修改所有密码。
常见CPU跑满原因及处理
应用代码问题死循环、递归失控、大量正则匹配、字符串拼接、频繁序列化。处理:定位线程栈后修复代码,增加缓存和限流,必要时回滚版本。
GC频繁堆内存过小、内存泄漏、大对象频繁创建。处理:调整JVM参数
-Xms -Xmx -Xmn,优化代码减少对象创建,升级JDK版本。慢查询SQL未走索引、表数据量增大、锁竞争。处理:优化SQL,添加合适索引,拆分大表,读写分离。
流量突增促销活动、瞬秒、爬虫、cc攻破。处理:扩容实例规格,增加负载均衡,配置WAF和限流策略。
系统任务定时备份、日志切割、安全扫描、更新。处理:调整计划任务执行时间,限制任务资源占用。
内存不足导致swapswap使用升高,换页占用CPU。处理:增加内存,减少应用内存占用,关闭swap或降低swappiness。
内核参数不当网络连接数过多、conntrack表满。处理:调整
net.core.somaxconn、net.ipv4.tcp_max_syn_backlog、nf_conntrack_max。
使用阿里云监控与告警
阿里云控制台提供实时监控和告警功能。
进入ECS实例详情,点击“监控”页签,查看CPU使用率、磁盘IO、网络流量等指标。
设置告警规则:当CPU使用率连续5分钟大于90%时发送短信、邮件或钉钉通知。
使用云助手批量执行排查命令:
top-bn1|head-20 psaux--sort=-%cpu|head-10
开启日志服务,采集系统和应用日志,设置关键词告警,OutOfMemoryError”“too many connections”。