首页/云/云平台与虚拟化速查/virsh 磁盘限速:blkdeviotune
虚拟化操作94 条

virsh 磁盘限速:blkdeviotune

blkdeviotune 对单块虚拟盘设置 IOPS/带宽上限,适合多租户或共享存储环境做干扰隔离;支持按总量或读写分别限制。

云平台与虚拟化速查云更新于 2026-10-13

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 的叠加关系要理清:两者会共同生效,取更严格的一侧,配置前确认存储阵列是否已对该卷做过限制,避免阈值互相打架。

易错点

  • 对系统盘限速过紧:guest 启动与日志写入明显变慢
  • 只加 --live 不加 --config,宿主重启或虚机重定义后限速失效
  • 限速阈值按平均值设置,忽略业务峰值,白天出现大量超时
  • 把限速当作容量保障:它只约束单盘上限,宿主的整体 I/O 竞争仍需要存储侧 QoS

数据来源与参考

  • virsh 手册:blkdeviotune
  • libvirt 文档:Block IO tuning
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌