云硬盘 IO 瓶颈通常是数据库查询慢的根本原因,优先通过监控确认是否为 IO 等待过高,再考虑调整挂载参数或升级磁盘类型。
先说结论:不要盲目调整数据库参数,先确认云盘是否达到 IOPS 或带宽上限,再针对性优化。
- 先定位:使用 iostat 确认%util 和 await 指标是否异常
- 先做:调整文件系统挂载选项及数据库 IO 相关配置
- 再验证:观察慢查询日志及 IO 等待率是否下降
命令速用版
iostat -x 1 5
iotop -o若无法安装 iotop,可直接查看进程状态:
ps -eo pid,stat,cmd | grep ^D为什么会这样
云服务器磁盘多为共享存储,存在性能上限。当数据库频繁刷盘或随机读写过多时,容易触达云盘 IOPS 限制,导致请求排队。此时 CPU 会处于 iowait 状态,表现为查询响应变慢,但 CPU 使用率未必高。
分步处理
1. 确认磁盘性能水位
登录云控制台查看当前云硬盘类型(如 SSD、ESSD)及购买的 IOPS 上限。一般 ESSD 性能优于 SSD,但需确保业务峰值未超过购买配额。
2. 优化文件系统挂载(高风险操作)
修改前务必备份 fstab 文件,防止配置错误导致系统无法启动:
cp /etc/fstab /etc/fstab.bak编辑/etc/fstab,为数据盘分区添加 noatime 选项,减少读取时的元数据写入。修改后建议先执行 mount -a 测试配置是否正确,再重启。
/dev/vdb1 /data ext4 defaults,noatime 0 03. 调整数据库 IO 配置
以 MySQL 为例,编辑配置文件(如 /etc/my.cnf),在 [mysqld] 段添加以下参数:
[mysqld]
innodb_io_capacity = 2000
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT说明:innodb_io_capacity 根据磁盘 IOPS 调整;innodb_flush_log_at_trx_commit 设置为 2 可平衡性能与安全(每秒刷盘),测试环境可设为 0,生产环境慎用;O_DIRECT 绕过操作系统缓存。
4. 考虑升级磁盘
若%util 长期接近 100% 且 await 很高,说明硬件性能不足,需升级云盘类型或增加容量(部分云盘性能随容量增长)。
怎么验证是否生效
再次运行 iostat,观察 avgqu-sz 是否减小,await 是否降低。同时查看数据库慢查询日志,确认因锁等待或 IO 等待导致的慢查询是否减少。
如需基准测试,可使用 fio 工具(注意:勿在生产数据盘直接运行写测试):
fio -name=iotest -directory=/data -direct=1 -rw=randread -bs=4k -size=1G -numjobs=4 -runtime=60 -group_reporting常见坑
1. 不要随意关闭 fsync 机制,否则断电可能导致数据丢失。
2. 云盘性能可能受实例规格限制,仅升级磁盘不升级实例可能无效。
3. 随机读写性能通常远低于顺序读写,数据库索引设计不当会加剧 IO 压力。