一、定位IO瓶颈
调优前需准确判断IO压力来源。常用工具:
- iostat -x 1:查看磁盘利用率(%util)、平均等待时间(await)、服务时间(svctm)等指标。%util接近100%表明磁盘饱和。
- iotop:按进程实时显示IO读写速率,快速定位高IO进程。
- pidstat -d 1:按PID统计磁盘IO,适用于批量排查。
二、调整文件系统挂载参数
针对ext4/xfs等常用文件系统,优化挂载选项可减少IO开销:
- noatime:禁止更新atime(访问时间),避免每次读操作产生写IO。
- nodiratime:禁止更新目录的atime。
- nobarrier(仅对xfs/ext4+电池备份RAID卡):关闭写屏障,提升写入性能,但存在数据一致性风险,需谨慎使用。
- 示例:
mount -o remount,noatime,nodiratime /dev/sda1 /data
三、优化磁盘调度算法
根据磁盘类型选择合适的IO调度器:
- SSD:推荐 none(或noop),减少无谓的合并与排序。
- 机械盘:高并发随机读写用 deadline;大量顺序读写用 cfq 或 kyber。
- 临时修改:
echo deadline > /sys/block/sda/queue/scheduler
四、调整内核IO参数
- 提高IO请求队列深度:对SSD可增大
/sys/block/sda/queue/nr_requests(默认128,可设为512或更高),提升并发能力。 - 调整blkdev的预读大小:
blockdev --setra 4096 /dev/sda(单位512字节),适用于大文件顺序读场景。
五、应用层优化
- 合并小IO为批量读写:数据库批量插入、日志批量刷盘。
- 增加缓存层:使用Redis或Memcached减轻磁盘读压力;数据库增加buffer pool(如InnoDB buffer pool)。
- 异步IO与Direct IO:对延迟敏感场景使用aio(异步IO),避免同步阻塞。
六、硬件与架构调整
- 更换SSD:机械盘升级至NVMe SSD,IOPS可提升百倍。
- RAID卡缓存策略:设置RAID卡为Write Back + BBU(电池备份),配合nobarrier提升写性能。
- 分布式存储:单机IO瓶颈时,考虑分布式文件系统(如Ceph、GlusterFS)或云盘。
注意:所有调整应在测试环境验证后上线,并监控IO性能变化,避免因过度优化导致数据损坏或业务中断。