阿里云服务器CPU跑满排查

阿里云服务器CPU跑满排查

  • admin admin
  • 2026-09-12
  • 2078
  • 0

阿里云服务器CPU跑满排查是通过系统命令、监控工具和日志分析,定位占用CPU的进程、线程及底层原因并恢复负载的过程。确认CPU负载状态使用以下命令快速确认服务器是否出现CPU跑满以及负载压力。uptime输出示例:10:20:30 up ...

优惠价格:¥ 0.00
当前位置:首页 > 阿里云虚拟主机 > 阿里云服务器CPU跑满排查
详情介绍

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

阿里云服务器CPU跑满排查  第1张

确认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跑满原因及处理

  1. 应用代码问题死循环、递归失控、大量正则匹配、字符串拼接、频繁序列化。处理:定位线程栈后修复代码,增加缓存和限流,必要时回滚版本。

  2. GC频繁堆内存过小、内存泄漏、大对象频繁创建。处理:调整JVM参数-Xms -Xmx -Xmn,优化代码减少对象创建,升级JDK版本。

  3. 慢查询SQL未走索引、表数据量增大、锁竞争。处理:优化SQL,添加合适索引,拆分大表,读写分离。

  4. 流量突增促销活动、瞬秒、爬虫、cc攻破。处理:扩容实例规格,增加负载均衡,配置WAF和限流策略。

  5. 系统任务定时备份、日志切割、安全扫描、更新。处理:调整计划任务执行时间,限制任务资源占用。

  6. 内存不足导致swapswap使用升高,换页占用CPU。处理:增加内存,减少应用内存占用,关闭swap或降低swappiness。

  7. 内核参数不当网络连接数过多、conntrack表满。处理:调整net.core.somaxconnnet.ipv4.tcp_max_syn_backlognf_conntrack_max

使用阿里云监控与告警

阿里云控制台提供实时监控和告警功能。

  • 进入ECS实例详情,点击“监控”页签,查看CPU使用率、磁盘IO、网络流量等指标。

  • 设置告警规则:当CPU使用率连续5分钟大于90%时发送短信、邮件或钉钉通知。

  • 使用云助手批量执行排查命令:

top-bn1|head-20
psaux--sort=-%cpu|head-10
  • 开启日志服务,采集系统和应用日志,设置关键词告警,OutOfMemoryError”“too many connections”。

0