阿里云ECS磁盘IO占用高怎么进行性能调优?

在阿里云 ECS 实例上遇到磁盘 IO 占用高(iowait 升高或吞吐量打满)的情况,通常不是单一原因造成的,而是业务负载、存储类型、系统配置以及网络带宽共同作用的结果。作为长期处理云原生架构的工程师,我建议按照“定位瓶颈 -> 优化存储选型 -> 调整系统参数 -> 应用层优化”的逻辑进行排查和调优。

以下是具体的实操指南:

第一步:精准定位瓶颈源头

不要盲目调优,首先要确认是读多还是写多,是小文件随机 IO 还是大顺序 IO。

  1. 使用 iotop 或 pidstat 查看进程级 IO

    # 安装 iotop (若未安装)
    yum install iotop -y  # CentOS/RHEL
    apt install iotop -y # Ubuntu/Debian
    
    # 实时查看哪个进程产生最多 IO
    iotop -o
    • 关键点:如果是 MySQL/PostgreSQL 导致,检查是否缺少索引导致全表扫描;如果是 Nginx/Tomcat,检查是否有大量日志写入或静态资源访问。
  2. 使用 iostat 分析设备级指标

    yum install sysstat -y
    iostat -dx 1 5
    • 关注 %util:如果接近 100%,说明磁盘已饱和。
    • 关注 await:平均等待时间,若远高于 svctm,说明存在排队现象,性能瓶颈明显。
    • 关注 r/s, w/s:每秒读写次数。高 IOPS 场景(如数据库)通常表现为高 r/w 数但低吞吐量;高吞吐场景(如视频转码)表现为低 IOPS 但高 MB/s。
  3. 检查云监控控制台
    登录阿里云控制台,查看 ECS 实例的云盘性能曲线。注意区分:

    • IOPS 上限:你的云盘规格是否达到了最大 IOPS 限制?
    • 吞吐量上限:是否达到了 MB/s 限制?
    • 突发积分(针对 ESSD PL0/PL1):如果使用入门级 ESSD,检查 Burst 积分是否耗尽,导致性能被强制限制。

第二步:存储类型与规格优化(最有效手段)

在云端,升级存储类型往往比修改内核参数更有效且成本更低。

  1. 评估当前云盘类型

    • 高效云盘/SSD 云盘:适合一般 Web 应用,但 IOPS 有限。
    • ESSD (Enhanced SSD):强烈推荐用于数据库和高 IO 场景。
      • PL0:基础性能,适合开发测试。
      • PL1:均衡型,IOPS 可达 5 万+,延迟 <1ms,性价比最高。
      • PL2/PL3:极致性能,适用于核心数据库、HPC 等。
    • 操作建议:如果当前是高效云盘或普通 SSD,且业务对 IO 敏感,直接通过控制台扩容云盘性能级别(无需更换实例,数据无损)。
  2. 考虑本地盘(Instance Store)

    • 如果业务允许数据丢失风险(如临时缓存、日志聚合),选择带本地 NVMe SSD 的实例族(如 i 系列、c 系列部分型号)。
    • 优势:IO 性能远超任何网络云盘,延迟极低。
    • 劣势:实例释放后数据丢失,需配合分布式存储方案。
  3. 分离读写负载

    • 将数据库数据盘与系统盘、日志盘物理分离。
    • 对于高并发读场景,引入 Redis/Memcached 缓存热点数据,减少后端磁盘读取。

第三步:操作系统层面调优

在确认存储层非瓶颈后,可从 Linux 内核参数入手优化。

  1. 调整 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,手动修改前请先查阅官方文档。
  2. 优化内存缓冲(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
    • 警告:设置过高可能导致断电时丢失更多数据,需权衡业务容忍度。
  3. 禁用不必要的后台服务

    • 关闭 auditd(审计服务),它会显著增加系统调用开销。
    • 停止不需要的定时任务(如 logrotate 高频执行)。
  4. 文件系统挂载选项

    • 对于 ext4/xfs,挂载时添加 noatime,nodiratime,避免每次读取文件都更新访问时间戳,减少一次写 IO。
      mount -o remount,noatime,nodiratime /dev/vdb1 /mnt/data

第四步:应用层与架构优化

  1. 数据库层面

    • 索引优化:90% 的 DB IO 问题源于缺失索引或错误查询计划。使用 EXPLAIN 分析慢查询。
    • 连接池管理:避免连接泄漏导致长时间持有锁和 IO 资源。
    • 事务粒度:缩短长事务,减少锁竞争和中间状态落盘。
  2. 日志策略

    • 异步写入:应用日志采用异步队列(如 Kafka、RabbitMQ)收集,而非直接同步写入磁盘。
    • 轮转策略:合理设置 logrotate 频率,避免在高峰时段压缩日志。
  3. 利用 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云枢 » 阿里云ECS磁盘IO占用高怎么进行性能调优?