AWS EC2实例CPU使用率突发升至99% 如何定位异常进程
针对该场景的定位方案
EC2实例本身没有内置的、重启后即可生效的专门用来定位高CPU进程的官方开关,但你可以在Ubuntu系统层面配置开机自启的监控规则,实例重启后相关监控会自动运行,无需手动操作就能捕捉突发高CPU的进程数据。
1. 轻量历史性能采集配置
推荐使用Ubuntu官方源自带的sysstat工具,可长期记录进程资源占用的历史数据:
- 安装工具:
sudo apt install sysstat - 开启开机自启采集:修改
/etc/default/sysstat文件,将ENABLED="false"改为ENABLED="true" - 调整采集间隔为1分钟(默认10分钟,更容易捕捉突发问题):修改
/etc/cron.d/sysstat中的规则,把*/10 * * * * root /usr/lib/sa/sa1 1 1改为*/1 * * * * root /usr/lib/sa/sa1 1 1 - 重启服务生效:
sudo systemctl restart sysstat - 问题回溯方法:出问题后执行
sar -u -f /var/log/sysstat/saXX(XX为对应日期的数字),即可查看过去任意时段的进程CPU占用排行,哪怕你当时没有连接实例也能查到历史数据。
2. 高CPU触发自动快照配置
你可以写一个简单的后台监控脚本,配置开机自启,检测到CPU使用率超过阈值时自动记录当时的进程排行:
- 新建脚本文件
/usr/local/bin/cpu_monitor.sh,内容如下:
#!/bin/bash while true; do CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}') if (( $(echo "$CPU_USAGE > 90" | bc -l) )); then echo "=== CPU high at $(date) ===" >> /var/log/cpu_high.log ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -20 >> /var/log/cpu_high.log echo "=== End of snapshot ===" >> /var/log/cpu_high.log sleep 60 fi sleep 10 done
- 赋予执行权限:
chmod +x /usr/local/bin/cpu_monitor.sh - 配置开机自启:在
/etc/rc.local文件的exit 0行之前添加/usr/local/bin/cpu_monitor.sh &,实例重启后脚本会自动后台运行,问题发生后直接查看/var/log/cpu_high.log即可拿到异常进程信息。
3. 额外排查提示
- t2系列实例采用CPU积分机制,可先在EC2控制台监控页查看
CPUCreditBalance指标,如果指标降到0,说明是CPU积分耗尽导致的实例性能受限,不属于进程占用过高的问题,需要优化服务配置或升级实例规格。 - Spring Boot服务可以在启动参数中添加GC日志打印配置,排查是否是内存不足触发频繁Full GC导致的CPU飙高。
- MySQL、Mongo可以开启慢查询日志,排查是否是数小时后触发的大量慢查询占满CPU。
内容的提问来源于stack exchange,提问作者Kumar Gaurav
相关产品推荐
相关产品推荐

