生产环境实战:AWS EC2 实例 “CPU 使用率突高” 的 CloudWatch 监控与排查
·
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
- 查看 CPUUtilization 图表:识别突高时间点,检查是否伴随其他指标异常(如 "NetworkIn" 或 "DiskReadOps")。例如:
-
步骤 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.logfor web servers)。
- 使用工具分析:
- grep 或 awk:搜索错误模式,例如
grep -i "out of memory" /var/log/*。 - CloudWatch Logs:如果日志已上传,在控制台过滤时间范围。
- grep 或 awk:搜索错误模式,例如
- 查看常见日志文件:
-
常见原因诊断表:
症状 可能原因 验证方法 单个进程 CPU 高 应用程序 bug 或无限循环 使用 top和strace -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。
- 如果进程异常:终止高 CPU 进程,例如
-
长期优化:
- 应用程序优化:
- 代码审查:修复内存泄漏或低效算法(例如,避免 $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 监控。
- 设置 Auto Scaling 组:基于 CPU 指标自动扩展实例,配置示例:
- 监控增强:
- 集成 X-Ray 或 CloudTrail:追踪请求链路,识别瓶颈。
- 定期压力测试:使用工具如 JMeter 模拟负载。
- 应用程序优化:
4. 预防措施总结
- 持续监控:设置多个 CloudWatch 警报(如 CPU > 70% 警告,> 90% 严重)。
- 自动化响应:使用 Lambda 函数自动重启实例或发送通知。
- 成本优化:结合 Trusted Advisor 检查资源利用率,避免过度配置。
- 文档化:记录排查过程和解决方案,便于团队知识共享。
通过本指南,您可以高效处理 CPU 突高事件。实际环境中,建议结合 AWS Support 或工具如 Datadog 进行深度分析。记住,预防胜于治疗:定期审查监控配置和应用程序性能。
更多推荐
所有评论(0)