MySQL Enterprise Backup (mysqlbackup) 執行時 I/O 暴增,擠佔線上業務資源,導致應用響應緩慢甚至不可用。mysqlbackup 內建 --read-threads/--write-threads/--limit-bytes-per-sec 但效果有限。
Linux Control Groups (cgroups) blkio 子系統可精確限制進程組的塊設備 I/O 頻率 (IOPS) 或吞吐 (BPS)。
mkdir -p /cgroup/blkio mount -t cgroup -o blkio none /cgroup/blkio
cgcreate -g blkio:/mysqlbackup
ls -l /dev/mapper/vgdb01-lvdb01 # lrwxrwxrwx 1 root root 7 Sep 26 14:22 /dev/mapper/vgdb01-lvdb01 -> ../dm-2 ls -l /dev/dm-2 # brw-rw---- 1 root disk 253, 2 Sep 26 14:22 /dev/dm-2 # major=253, minor=2
# 限制讀寫各 20 IOPS cgset -r blkio.throttle.read_iops_device="253:2 20" mysqlbackup cgset -r blkio.throttle.write_iops_device="253:2 20" mysqlbackup
echo $$ > /cgroup/blkio/mysqlbackup/tasks # 驗證 cat /proc/$$/cgroup # 1:blkio:/mysqlbackup
mysqlbackup --user=root --password=xxxxxx --with-timestamp --backup-dir=/data/backup backup
iostat -x 1 觀察目標設備 r/s、w/s 穩定在 20 左右# 限制讀寫各 10 MB/s cgset -r blkio.throttle.read_bps_device="253:2 10485760" mysqlbackup cgset -r blkio.throttle.write_bps_device="253:2 10485760" mysqlbackup
# /etc/systemd/system/mysqlbackup.service [Unit] Description=MySQL Enterprise Backup with I/O Throttling After=network.target [Service] Type=oneshot ExecStartPre=/usr/local/bin/setup_backup_cgroup.sh ExecStart=/usr/bin/mysqlbackup --user=root --password=xxxxxx --backup-dir=/data/backup backup ExecStopPost=/usr/local/bin/cleanup_backup_cgroup.sh [Install] WantedBy=multi-user.target
#!/bin/bash # setup_backup_cgroup.sh CGROUP_PATH="/sys/fs/cgroup/blkio/mysqlbackup" mkdir -p $CGROUP_PATH echo "253:2 20" > $CGROUP_PATH/blkio.throttle.read_iops_device echo "253:2 20" > $CGROUP_PATH/blkio.throttle.write_iops_device echo $$ > $CGROUP_PATH/tasks
| 方案 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|
| cgroups blkio | 內核級強制限制、精確、無需修改應用 | 需 root、僅限 Linux、不支援網路/NFS 設備 | 物理機/VM 本地盤備份限流 |
| mysqlbackup 內建限速 | 跨平台、無需 root | 精度低、易被繞過、進程內部排隊 | 簡單場景、無 root 權限 |
| ionice | 簡單、標準工具 | 需 CFQ 調度器、僅優先級無硬限制 | 舊內核、CFQ 環境 |
| tc/qdisc (網路限速) | 支援網路存儲 | 複雜、延遲高 | NFS/iSCSI 備份 |