在阿里云 ECS 实例上遇到磁盘 IO 占用高(iowait 升高或吞吐量打满)的情况,通常不是单一原因造成的,而是业务负载、存储类型、系统配置以及网络带宽共同作用的结果。作为长期处理云原生架构的工程师,我建议按照“定位瓶颈 -> 优化存储选型 -> 调整系统参数 -> 应用层优化”的逻辑进行排查和调优。
以下是具体的实操指南:
第一步:精准定位瓶颈源头
不要盲目调优,首先要确认是读多还是写多,是小文件随机 IO 还是大顺序 IO。
-
使用
iotop或pidstat查看进程级 IO# 安装 iotop (若未安装) yum install iotop -y # CentOS/RHEL apt install iotop -y # Ubuntu/Debian # 实时查看哪个进程产生最多 IO iotop -o- 关键点:如果是 MySQL/PostgreSQL 导致,检查是否缺少索引导致全表扫描;如果是 Nginx/Tomcat,检查是否有大量日志写入或静态资源访问。
-
使用
iostat分析设备级指标yum install sysstat -y iostat -dx 1 5- 关注
%util:如果接近 100%,说明磁盘已饱和。 - 关注
await:平均等待时间,若远高于svctm,说明存在排队现象,性能瓶颈明显。 - 关注
r/s,w/s:每秒读写次数。高 IOPS 场景(如数据库)通常表现为高 r/w 数但低吞吐量;高吞吐场景(如视频转码)表现为低 IOPS 但高 MB/s。
- 关注
-
检查云监控控制台
登录阿里云控制台,查看 ECS 实例的云盘性能曲线。注意区分:- IOPS 上限:你的云盘规格是否达到了最大 IOPS 限制?
- 吞吐量上限:是否达到了 MB/s 限制?
- 突发积分(针对 ESSD PL0/PL1):如果使用入门级 ESSD,检查 Burst 积分是否耗尽,导致性能被强制限制。
第二步:存储类型与规格优化(最有效手段)
在云端,升级存储类型往往比修改内核参数更有效且成本更低。
-
评估当前云盘类型
- 高效云盘/SSD 云盘:适合一般 Web 应用,但 IOPS 有限。
- ESSD (Enhanced SSD):强烈推荐用于数据库和高 IO 场景。
- PL0:基础性能,适合开发测试。
- PL1:均衡型,IOPS 可达 5 万+,延迟 <1ms,性价比最高。
- PL2/PL3:极致性能,适用于核心数据库、HPC 等。
- 操作建议:如果当前是高效云盘或普通 SSD,且业务对 IO 敏感,直接通过控制台扩容云盘性能级别(无需更换实例,数据无损)。
-
考虑本地盘(Instance Store)
- 如果业务允许数据丢失风险(如临时缓存、日志聚合),选择带本地 NVMe SSD 的实例族(如 i 系列、c 系列部分型号)。
- 优势:IO 性能远超任何网络云盘,延迟极低。
- 劣势:实例释放后数据丢失,需配合分布式存储方案。
-
分离读写负载
- 将数据库数据盘与系统盘、日志盘物理分离。
- 对于高并发读场景,引入 Redis/Memcached 缓存热点数据,减少后端磁盘读取。
第三步:操作系统层面调优
在确认存储层非瓶颈后,可从 Linux 内核参数入手优化。
-
调整 I/O Scheduler(调度算法)
- 机械硬盘/传统 SSD:
deadline或bfq通常表现更好。 - 高性能 NVMe/ESSD:建议使用
none或mq-deadline。 - 查看当前调度器:
cat /sys/block/vda/queue/scheduler - 修改方法(以 vda 为例):
echo none > /sys/block/vda/queue/scheduler # 永久生效需写入 /etc/rc.local 或 systemd service - 注意:阿里云新一代 ESSD 通常默认使用
none或优化过的 mq-deadline,手动修改前请先查阅官方文档。
- 机械硬盘/传统 SSD:
-
优化内存缓冲(Buffer Cache)
- 确保有足够的 RAM 用于页缓存(Page Cache),避免频繁回写磁盘。
- 调整
vm.dirty_ratio和vm.dirty_background_ratio:# 默认值通常为 20 和 10 # 适当提高可让内核批量刷盘,减少小 IO 开销 sysctl vm.dirty_ratio=40 sysctl vm.dirty_background_ratio=20 - 警告:设置过高可能导致断电时丢失更多数据,需权衡业务容忍度。
-
禁用不必要的后台服务
- 关闭
auditd(审计服务),它会显著增加系统调用开销。 - 停止不需要的定时任务(如
logrotate高频执行)。
- 关闭
-
文件系统挂载选项
- 对于 ext4/xfs,挂载时添加
noatime,nodiratime,避免每次读取文件都更新访问时间戳,减少一次写 IO。mount -o remount,noatime,nodiratime /dev/vdb1 /mnt/data
- 对于 ext4/xfs,挂载时添加
第四步:应用层与架构优化
-
数据库层面
- 索引优化:90% 的 DB IO 问题源于缺失索引或错误查询计划。使用
EXPLAIN分析慢查询。 - 连接池管理:避免连接泄漏导致长时间持有锁和 IO 资源。
- 事务粒度:缩短长事务,减少锁竞争和中间状态落盘。
- 索引优化:90% 的 DB IO 问题源于缺失索引或错误查询计划。使用
-
日志策略
- 异步写入:应用日志采用异步队列(如 Kafka、RabbitMQ)收集,而非直接同步写入磁盘。
- 轮转策略:合理设置
logrotate频率,避免在高峰时段压缩日志。
-
利用 CDN 和 OSS
- 静态资源(图片、JS、CSS)务必上 CDN。
- 海量非结构化数据存入 OSS,ECS 仅作为计算节点,避免 ECS 磁盘成为瓶颈。
第五步:高级技巧——云盘快照与备份优化
- 避免在业务高峰期进行快照创建:虽然阿里云快照支持在线创建,但初期快照仍会消耗少量 IO 资源。建议在低峰期执行全量快照。
- 使用云盘自动备份策略:设置合理的保留周期,避免过多历史快照影响云盘性能(尽管现代云盘对此影响极小,但仍需注意)。
总结建议
| 场景 | 推荐方案 |
|---|---|
| 通用 Web 服务 | 升级至 ESSD PL1 + noatime 挂载 + CDN 提速静态资源 |
| MySQL/PG 数据库 | ESSD PL2/PL3 + 独立数据盘 + 索引优化 + Redis 缓存 + 调整 dirty_ratio |
| 大数据/HPC | 本地 SSD 实例族 + 并行文件系统(如 CPFS) |
| 日志聚合 | 应用异步日志 + Logtail 采集 + 直接写入 SLS(日志服务),避免落盘 ECS 磁盘 |
最后提醒:在进行任何内核参数或文件系统修改前,务必创建云盘快照作为备份,并在测试环境验证后再生产环境实施。云计算的优势在于弹性,很多时候“加钱升级配置”比“深度调优”更经济高效。
CLOUD云枢