先看硬件:HDD、SATA SSD、NVMe SSD性能差异巨大,顺序写低于100MB/s或iostat中%util常驻>70%需预警;共盘I/O必争抢,NVMe w/s>50k、机械盘>200才逼近极限;备份前用dd测速、df查路径、iotop抓真凶,避免盲目限流。

备份前怎么快速判断磁盘I/O是否扛得住
别等备份跑起来再看 iostat,得提前摸清设备真实吞吐能力。机械盘、SATA SSD、NVMe SSD 的随机读写能力差十倍不止,盲目套用同一套限流参数会失效。
实操建议:
- 用
dd if=/dev/zero of=/backup/test bs=1M count=1024 oflag=direct测目标盘顺序写速度,低于 100MB/s 的盘要警惕 - 查
iostat -x 1中当前%util是否常驻 >70%,若已接近 90%,说明业务本身就在压盘,备份大概率触发毛刺 - 确认备份目标路径和 MySQL 数据目录不在同一块物理盘(
df -P /var/lib/mysql /backup对比Filesystem列),共盘必抢 I/O - SSD 上
%util高不等于过载,得同步看r/s和w/s:NVMe 盘w/s > 50k才算逼近极限,机械盘超200就该预警
备份中如何实时抓出真正在吃带宽的进程
top 按 CPU 排序是误导——备份卡顿八成不是 CPU 满,而是进程堵在 I/O 等待上。真正拖慢备份的,往往是那些处于 D(uninterruptible sleep)状态的内核线程,或 iotop -o 里排第一的 mysqld、gzip、pv。
实操建议:
- 运行
iotop -o -b -n 1抓当前实际 I/O 进程,别信ps aux | grep mysqldump——它只是个外壳,真正干活的是mysqld主进程 - 若看到
ksmd或kswapd0占高 I/O,说明内存不足触发了交换,得调低mysqldump --quick或关掉--compress - 备份写 NAS 或 NFS 时,
await高但svctm低,基本可断定是网络延迟,此时加ionice无效,得换本地盘或优化挂载参数(如noatime,nodiratime,hard,intr) - 脚本里嵌入轻量监控:
timeout 3 iostat -x 1 2 | tail -1 | awk '{print $14}'提取%util,超阈值自动退出备份
mysqldump 和 XtraBackup 的带宽行为差异在哪
mysqldump 是“读一行、转 SQL、写一行”,本质是大量小块随机读 + 文本写;XtraBackup 是“按页直接拷 ibdata1 和 .ibd”,属于大块顺序读 + 二进制写。两者对 I/O 子系统压力模式完全不同,不能混用同一套限流逻辑。
实操建议:
-
mysqldump加--quick --skip-extended-insert减少内存缓存,避免临时表撑爆 buffer,降低%wa -
XtraBackup必须配--throttle=100(单位是 IOPS),而不是cpulimit——它不怎么耗 CPU,但会持续发 4K/64K 读请求,--throttle才能压住队列深度 - 用
--stream=xbstream | ssh backup@host "xbstream -x"做远程备份时,网络带宽会成为新瓶颈,pv -L 20m比限 I/O 更有效 - 二者都禁用
gzip内置压缩(--compress或--compress-threads),改用外部pigz -p4并绑定到空闲 CPU 核,避免和mysqld抢资源
为什么监控到的带宽和实际业务感知不一致
常见现象:iostat 显示 sdb %util=95%,但业务查询 P99 延迟只涨了 2ms;另一台机器 %util=60%,P99 却翻了 5 倍。根本原因在于,%util 是设备驱动层统计,而业务延迟取决于 I/O 请求在队列里的排队时间,即 await —— 它受队列调度策略、IO depth、存储固件影响极大,无法被简单百分比反映。
实操建议:
- 机械盘上
await > 30ms就危险,SSD 上超过10ms就该查,别死盯%util - 用
cat /sys/block/sdb/device/queue_depth看队列深度,若为 1(常见于某些 USB 或虚拟盘),哪怕%util=20%也会导致严重排队 - Percona Toolkit 的
pt-ioprofile能定位到具体文件(如/var/lib/mysql/ibdata1)的读写热点,比泛泛看设备名更准 - 最易被忽略的一点:备份进程的
open()系统调用频率。频繁打开关闭临时文件(如mysqldump --tab)会引发大量 metadata I/O,在 ext4 上尤其伤,应改用单文件输出


















