blkdeviotune 是干什么的
virsh blkdeviotune 对虚机的某一块磁盘做 I/O 限速,可以限制总 IOPS、总带宽,也可以读写分别限制。它的用途是避免单台虚机抢占存储带宽造成邻座干扰,让多租户或混部环境的 I/O 表现可预期。限速由 QEMU 在块设备层执行,与宿主侧的 cgroup 限速互为补充。
基本信息
| 查看当前值 | virsh blkdeviotune vm1 vda |
|---|---|
| 总量限速 | --total-iops-sec / --total-bytes-sec |
| 读写分设 | --read-iops-sec、--write-iops-sec、--read-bytes-sec、--write-bytes-sec |
| 生效范围 | --live 立即生效、--config 持久保存 |
| 单位 | iops 为次数/秒,bytes 为字节/秒 |
典型使用场景
- 多租户宿主上限制单台虚机的磁盘吞吐,避免相互影响
- 把备份、日志类虚机的写带宽压低,保护核心业务
- 迁移或演练期间限制复制流量对存储的冲击
- 测试环境里模拟慢盘,验证应用的超时与重试逻辑
把 vda 限制为 500 IOPS、100MiB/s
把 vda 限制为 500 IOPS、100MiB/s
virsh blkdeviotune vm1 vda \
--total-iops-sec 500 --total-bytes-sec 104857600 \
--live --config
virsh blkdeviotune vm1 vda # 复核当前生效值
virsh domblklist vm1 # 确认目标磁盘的设备名没有搞错
# 清除限速:把数值重新设为 0参数读法
| 参数 | 含义 | 单位 |
|---|---|---|
| --total-iops-sec | 每秒 I/O 次数总上限 | 次/秒 |
| --total-bytes-sec | 每秒读写字节总量上限 | 字节/秒 |
| --read-iops-sec | 读方向 IOPS 上限 | 次/秒 |
| --write-bytes-sec | 写方向带宽上限 | 字节/秒 |
| 设为 0 | 取消该项限制 | — |
限速作用于该盘整条链路,突发型业务可能被误伤;建议先在测试环境验证阈值,再按业务峰值留出余量。
部分 libvirt 版本还提供带 -max 后缀的突发上限参数,行为随版本变化较大,配置前按所用版本的官方文档核对,不要直接照抄他处示例。
限速前的准备
- 先用 fio 或业务监控测出该虚机磁盘的基线 IOPS 与带宽,再决定阈值
- 确认限制目标是保护其他业务,还是约束本虚机自身,两者取值差别很大
- 按业务峰值留出余量,例如基线峰值的 1.2 到 1.5 倍
- 限速生效后用 virsh blkdeviotune 复核,并在 guest 内压测验证是否被误伤
- 把限速值写进配置管理与巡检项,避免只存在于某次手工操作里
限速与存储侧 QoS 的叠加关系要理清:两者会共同生效,取更严格的一侧,配置前确认存储阵列是否已对该卷做过限制,避免阈值互相打架。