AWS EC2 实例 CPU 使用率突高的 CloudWatch 监控与排查实战指南

在生产环境中,AWS EC2 实例的 CPU 使用率突然升高可能导致服务延迟、性能瓶颈甚至宕机。常见原因包括应用程序 bug、外部攻击(如 DDoS)、资源不足或配置错误。本指南将逐步指导您使用 CloudWatch 监控和排查问题,确保快速恢复服务稳定。所有步骤基于 AWS 最佳实践,力求真实可靠。

1. 监控 CPU 使用率:使用 CloudWatch 设置警报

CloudWatch 是 AWS 的核心监控服务,能实时收集 EC2 的 CPU 指标。以下是设置监控的步骤:

  • 步骤 1: 访问 CloudWatch 控制台

    • 登录 AWS 管理控制台,导航到 CloudWatch。
    • 在左侧菜单,选择 "Metrics" > "All metrics",然后筛选 EC2 实例的 "Per-Instance Metrics"。
    • 找到您的实例 ID,选择 "CPUUtilization" 指标。该指标表示 CPU 使用百分比,计算公式为: $$ \text{CPUUtilization} = \frac{\text{User Time} + \text{System Time}}{\text{Total Time}} \times 100% $$ 其中,User Time 和 System Time 是操作系统报告的 CPU 时间。
  • 步骤 2: 创建警报

    • 在指标图表上,点击 "铃铛图标" 创建警报。
    • 设置阈值:例如,当 CPU 使用率超过 $80%$ 持续 5 分钟时触发警报(根据您的业务需求调整)。
    • 配置通知:通过 SNS 发送警报到邮箱或 Slack,确保团队及时响应。
    • 示例警报设置(YAML 格式,用于 Infrastructure as Code):
      AWSTemplateFormatVersion: '2010-09-09'
      Resources:
        HighCPUAlarm:
          Type: AWS::CloudWatch::Alarm
          Properties:
            AlarmName: "EC2-High-CPU"
            MetricName: "CPUUtilization"
            Namespace: "AWS/EC2"
            Statistic: Average
            Period: 300  # 5 分钟周期
            EvaluationPeriods: 1
            Threshold: 80
            ComparisonOperator: GreaterThanThreshold
            AlarmActions:
              - !Ref MySNSTopic  # 引用您的 SNS 主题
      

  • 最佳实践

    • 启用详细监控:在 EC2 实例设置中,选择 "Enable detailed monitoring",以获取 1 分钟粒度的数据(默认是 5 分钟)。
    • 使用 CloudWatch Agent:安装代理以收集更细粒度的系统指标(如 per-process CPU),部署命令:
      sudo yum install -y amazon-cloudwatch-agent  # Amazon Linux
      sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
      

2. 排查 CPU 使用率突高的原因

当警报触发时,快速诊断根本原因。以下是系统化的排查步骤,优先使用 CloudWatch 数据,再深入实例内部。

  • 步骤 1: 分析 CloudWatch 指标

    • 查看 CPUUtilization 图表:识别突高时间点,检查是否伴随其他指标异常(如 "NetworkIn" 或 "DiskReadOps")。例如:
      • 如果 NetworkIn 同时飙升,可能遭遇 DDoS 攻击。
      • 如果 DiskReadOps 激增,可能磁盘 I/O 成为瓶颈。
    • 使用 CloudWatch Logs Insights:如果已配置日志代理,查询应用程序日志。示例查询(搜索高 CPU 时段的错误):
      fields @timestamp, @message
      | filter @message like /error/ or /high load/
      | stats count() by bin(5m)
      | sort @timestamp desc
      

  • 步骤 2: 登录 EC2 实例检查进程

    • 使用 SSH 或 Session Manager 连接实例。
    • 运行系统命令:
      • top 或 htop:查看实时进程 CPU 占用。按 "P" 键按 CPU 排序,识别高负载进程(如 Java 或 Python 应用)。
      • ps aux:列出所有进程,结合 grep 过滤可疑进程,例如:
        ps aux | sort -nrk 3 | head -10  # 显示 CPU 使用率 top 10 的进程
        

      • vmstat 或 mpstat:分析 CPU 使用分布。例如,mpstat -P ALL 2 每 2 秒报告每个核心的使用率。
  • 步骤 3: 检查应用程序和系统日志

    • 查看常见日志文件:
      • /var/log/syslog/var/log/messages:系统级错误。
      • 应用程序日志(如 /var/log/nginx/error.log for web servers)。
    • 使用工具分析:
      • grep 或 awk:搜索错误模式,例如 grep -i "out of memory" /var/log/*
      • CloudWatch Logs:如果日志已上传,在控制台过滤时间范围。
  • 常见原因诊断表

    症状可能原因验证方法
    单个进程 CPU 高应用程序 bug 或无限循环使用 topstrace -p <PID> 跟踪进程
    所有进程 CPU 高资源不足或外部攻击检查 CloudWatch NetworkIn 和 VPC Flow Logs
    CPU 突高伴随高 I/O磁盘或数据库瓶颈运行 iostat -dx 2 查看 I/O 等待
    周期性突高定时任务或爬虫检查 crontab (crontab -l) 和访问日志
3. 解决方案与优化

根据排查结果,采取针对性措施。目标是快速缓解并预防复发。

  • 立即缓解

    • 如果进程异常:终止高 CPU 进程,例如 kill -9 <PID>。但先备份状态。
    • 如果资源不足:垂直扩展(更改实例类型为更大规格,如 t3.small 到 m5.large)或水平扩展(添加更多实例)。
    • 如果外部攻击:启用 AWS Shield 或 WAF,并更新安全组规则限制来源 IP。
  • 长期优化

    • 应用程序优化
      • 代码审查:修复内存泄漏或低效算法(例如,避免 $O(n^2)$ 复杂度)。
      • 使用异步处理:对于高负载任务,引入 SQS 队列。
    • 基础设施调整
      • 设置 Auto Scaling 组:基于 CPU 指标自动扩展实例,配置示例:
        aws autoscaling put-scaling-policy --policy-name "ScaleOut-HighCPU" --auto-scaling-group-name "my-asg" --scaling-adjustment 1 --adjustment-type ChangeInCapacity --cooldown 300
        

      • 优化实例类型:选择计算优化型(如 C5)或启用 Burstable 实例的 credits 监控。
    • 监控增强
      • 集成 X-Ray 或 CloudTrail:追踪请求链路,识别瓶颈。
      • 定期压力测试:使用工具如 JMeter 模拟负载。
4. 预防措施总结
  • 持续监控:设置多个 CloudWatch 警报(如 CPU > 70% 警告,> 90% 严重)。
  • 自动化响应:使用 Lambda 函数自动重启实例或发送通知。
  • 成本优化:结合 Trusted Advisor 检查资源利用率,避免过度配置。
  • 文档化:记录排查过程和解决方案,便于团队知识共享。

通过本指南,您可以高效处理 CPU 突高事件。实际环境中,建议结合 AWS Support 或工具如 Datadog 进行深度分析。记住,预防胜于治疗:定期审查监控配置和应用程序性能。

更多推荐