AWS EC2实例高Iowait(top中%wa)问题排查与解决求助
高Iowait导致MongoDB写入性能骤降的原因及解决方案
可能的触发原因
- 磁盘资源瓶颈
- 磁盘使用率已达81%(872/1070GiB),接近满容量会大幅增加磁盘寻道时间,直接拖慢MongoDB的写入操作;
- EC2实例所用磁盘类型(如gp2)的突发IO耗尽后,性能会断崖式下跌,无法承载MongoDB的写入负载;若磁盘的IOPS、吞吐量配置不足,也会成为性能瓶颈。
- MongoDB配置与操作不当
- 大量未批量的单条插入/更新操作,频繁触发磁盘IO;
- 索引过多,写入时需维护大量索引,加剧IO开销;
- 日志同步策略过严(如
journalCommitInterval设置过小),导致频繁刷盘; - 内存分配不足:当前已用内存22.2GiB,若MongoDB的缓存(WiredTiger缓存或MMAPv1内存映射)占比不够,会频繁从磁盘读取数据,加重IO负载。
- Telegraf监控干扰
- Telegraf采集频率过高、采集指标过多,会与MongoDB争抢磁盘IO资源,无规律拉高Iowait。
- 系统后台任务影响
- 无规律执行的定时任务(如备份、磁盘扫描、日志清理)会占用大量IO资源,导致Iowait飙升。
解决步骤
紧急缓解
- 释放磁盘空间
- 清理MongoDB旧日志、系统临时文件,将磁盘使用率降到70%以下;
- 归档或删除MongoDB过期数据,迁移冷数据到低成本存储(如S3)。
- 临时调整MongoDB配置
- 将
journalCommitInterval调整为500ms(默认100ms),减少刷盘频率; - 暂停非必要的索引创建,待IO恢复后再执行。
- 将
长期优化
- 升级磁盘配置
- 切换为IO优化型磁盘(如gp3、io2),自定义IOPS和吞吐量以匹配MongoDB的负载;
- 扩容磁盘容量,确保长期使用率低于70%。
- 优化MongoDB性能
- 改用批量插入/更新操作,减少磁盘IO次数;
- 清理无用索引,优化高频查询的索引结构,降低写入时的索引维护开销;
- 合理分配内存:将WiredTiger的
cacheSizeGB设置为物理内存的50%-60%(约15GiB),减少磁盘交换; - 开启慢查询日志定位问题:
# 修改mongod.conf配置 slowms: 100 profile: 1
- 优化Telegraf配置
- 降低采集间隔(如从10s改为30s/60s);
- 关闭非核心监控指标,减少IO占用。
- 排查系统后台任务
- 检查
crontab -l、systemctl list-timers中的定时任务,将高IO任务调整到业务低峰期执行; - 定期执行
fstrim清理磁盘碎片(AWS EBS支持在线trim)。
- 检查
- 完善监控告警
- 用CloudWatch或Telegraf监控磁盘IOPS、Iowait、MongoDB写入延迟等指标,设置告警阈值提前预警;
- 监控MongoDB的
db.serverStatus()指标,查看缓存命中率、写入队列状态。
内容的提问来源于stack exchange,提问作者Son Nguyen Duc
相关产品推荐
相关产品推荐

