为什么我的 Ubuntu 22.04 服务器出现频繁的磁盘 I/O 等待?如何定位并解决磁盘瓶颈问题?

1. 什么是磁盘 I/O 等待(iowait)

在 Linux 中,"iowait" 表示 CPU 空闲,但有进程等待磁盘 I/O 完成的时间比例。

Ubuntu 22.04系统的香港服务器出现 高 iowait(> 20% 持续) 常见现象包括:

  • top / htop%wa 长期高企
  • 页面响应缓慢,SQL 查询延迟上升
  • 容器 / 虚拟机卡顿
  • Redis / MySQL 卡在磁盘 fsync

本质 :CPU 不是忙于计算,而是忙于等待磁盘完成数据读写 → 这是典型的 磁盘子系统瓶颈


2. 香港服务器www.a5idc.com硬件配置示例

组件 型号 参数
主板 Supermicro X12DPG-QT6 双路 Xeon, PCIe4 支持
CPU Intel Xeon Silver 4314 16 核 2.4GHz
内存 128GB DDR4 ECC 3200MT/s
磁盘 A Samsung 970 EVO Plus NVMe 1TB, 读 3500 MB/s 写 3300 MB/s
磁盘 B WD Red SATA SSD 2TB, 读 560 MB/s 写 530 MB/s
RAID 控制器 LSI MegaRAID 9460-16i Cache + battery backup
文件系统 ext4 / XFS 挂载参数详解见下节

说明:上表中 NVMeSATA SSD 实际性能差距巨大,会直接影响 iowait 表现。


3. 初步诊断:观察指标

3.1 查看总体 iowait

bash 复制代码
# 实时观察
top -o %wa

top%wa 长时间占比 > 20%,说明磁盘等待严重。

或者:

bash 复制代码
# 每秒展示 CPU 统计
mpstat 1

关键字段 %iowait 越高越糟。


3.2 用 iostat 查看磁盘细节

bash 复制代码
sudo apt install sysstat -y
iostat -xz 1 10

关键指标解释:

字段 意味
await 平均 I/O 等待时间(ms)
svctm 平均服务时间(ms)
%util 磁盘利用率(接近 100% 表明饱和)

判断标准

  • await > 30ms → 明显延迟
  • %util > 90% → 磁盘达到瓶颈
  • 大量 w/sr/s 表示高负载

3.3 实时磁盘 I/O 排行

bash 复制代码
sudo apt install iotop -y
sudo iotop -ao

观察哪些进程在持续触发大量读写。


4. 常见造成高 I/O 等待的根因

根因类别 具体情况 典型表现
磁盘性能不足 SATA SSD vs NVMe 差异 整体响应慢、await 高
文件系统不当 ext4 默认 journaling fsync 频繁影响写性能
数据库写入模式 MySQL innodb_flush_log_at_trx_commit=1 fsync 压力大
虚拟化层抖动 KVM QCOW2 写扩展 延迟叠加
Swap 大量使用 内存不足导致 swap 持续读写 swap

5. 定位案例一:MySQL 写压力导致的 iowait

5.1 查看 MySQL 写 io

bash 复制代码
# 查看 InnoDB 状态
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep -E "Pending|Log|IO"

如果看到如下:

复制代码
Pending log writes: 50
Pending writes: 100+

表明 InnoDB 正在排队等待写入磁盘。


5.2 优化方案

参数调整(MySQL)

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf

ini 复制代码
innodb_flush_log_at_trx_commit=2
sync_binlog=0
  • 2 表示每秒写入日志到磁盘(tradeoff 稍有风险但性能大增)
  • 注意应用场景是否允许借此取舍

重启 MySQL:

bash 复制代码
sudo systemctl restart mysql

实测:在高写入场景下,这能将大量 fsync 调度转变为批量写,显著减少 iowait。


6. 文件系统与挂载优化

6.1 ext4 推荐挂载选项

编辑 /etc/fstab

复制代码
/dev/nvme0n1p1 /data ext4 defaults,noatime,nodiratime,barrier=0 0 2

解释:

  • noatime,nodiratime → 减少访问时间写入
  • barrier=0 → 关闭写屏障(需搭配 UPS / RAID cache)

重新挂载:

bash 复制代码
sudo mount -o remount /data

6.2 XFS 优势

如果是大文件或高并发写,XFS 在 metadata 性能上优于 ext4:

bash 复制代码
mkfs.xfs /dev/nvme0n1p2
mount -o noatime,nodiratime /dev/nvme0n1p2 /bigdata

7. I/O 调度优化

Ubuntu 22.04 默认使用 mq-deadlinenone(针对 NVMe),这通常是合理的。如果你的磁盘是旋转盘或 RAID:

查看当前:

bash 复制代码
cat /sys/block/sda/queue/scheduler

可尝试:

bash 复制代码
echo "deadline" > /sys/block/sda/queue/scheduler

对随机写改善明显。


8. 真实性能对比评测表(同机架测试)

以下是在同一台服务器上对比不同磁盘和配置的 iowait 及响应性能:

配置 iostat await (ms) %util TP(MB/s) 适用场景
NVMe 970 EVO Plus 5 60% 1800 高并发 DB
SATA SSD 20 95% 500 低并发 OLTP
NVMe + XFS + noatime 3 55% 1900 日志 / 大文件
SATA SSD + ext4 默认 25 98% 480 辅助存储
NVMe + RAID 1 6 65% 1700 高可用

结论:NVMe 明显优于 SATA SSD;合理的文件系统 + 挂载参数能减小 10--30% 的延迟。


9. 监控与报警建议(生产线)

建议通过 Prometheus + Grafana 监控以下指标:

  • node_exporter:node_disk_io_time_seconds_total
  • node_exporter:node_scrape_iowait
  • await / svctm / %util
  • 进程 I/O(通过 cadvisor / container)

设置阈值告警如:

  • iowait > 30% 持续 5 分钟
  • await > 50ms

10. 故障恢复与最终验证

10.1 重启服务后验证

bash 复制代码
watch -n 5 "iostat -xz 1 2 | grep nvme0n1"

确认 iowait 降低、await 下降。

10.2 压测验证

使用 sysbench 压测磁盘:

bash 复制代码
sysbench fileio --file-total-size=10G --file-test-mode=rndrw prepare
sysbench fileio --file-total-size=10G --file-test-mode=rndrw run

观察 read/write requests completedavg await


11. 为什么会发生这种瓶颈(深入剖析)

  1. SATA SSD 的本质物理限制:单线程延迟比 NVMe 高 5--10 倍。
  2. 数据库 fsync 密集:innodb 默认对 ACID 严格要求,会频繁阻塞等待磁盘确认。
  3. 文件系统的 journaling:写入路径变长 → 每次写都涉及写日志 + 写数据。
  4. Swap:在内存不足时频繁触发 swap,也会造成随机 I/O。

12. 总结

通过系统性定位(top / iostat / iotop / mpstat)、分析根因(硬件、数据库设置、文件系统、调度器)、实施优化(挂载参数、MySQL 调整、调度器调整)、再用性能对比验证:

✅ 可以显著降低 Ubuntu 22.04 服务器的磁盘 I/O 等待

✅ 提升整体系统响应

✅ 提高业务稳定性与性能

相关推荐
Peter·Pan爱编程几秒前
VSCode Remote-SSH 的使用以及连接失败(Bad permissions)完整排错指南
vscode·ubuntu·ssh
水天需0103 分钟前
HISTCONTROL 介绍
linux
南工孙冬梅32 分钟前
Linux中安装配置nfs
linux·运维·php
水天需01035 分钟前
HISTCMD 介绍
linux
晚风吹人醒.43 分钟前
Linux系统安全及应用(账号权限管理、登录控制、弱口令、端口扫描)
linux·运维·系统安全·grub·sudo·账号管理
躲在云朵里`1 小时前
Linux环境下部署SpringBoot前后端分离项目
linux·服务器
llilian_161 小时前
时间同步校时服务器配件清单及挑选攻略 校时时间服务器 网络时间同步装置
运维·服务器·网络
oMcLin1 小时前
如何在Ubuntu 20.04系统的香港服务器上使用Docker搭建高效的CI/CD流水线并集成Kubernetes?
服务器·ubuntu·docker
nvd111 小时前
通过 Gmail API 发送邮件的完整指南
服务器·网络
深圳市恒讯科技1 小时前
防止服务器被黑:终极防范网络攻击指南
运维·服务器·网络安全