Post

Libvirt 磁盘 IO 限速

随着公司开发业务的不断增重,Dell 服务器上的虚拟机日益增多,而虚拟机磁盘却都压在物理服务器单块raid 磁盘上共享 IO。考虑到某台虚拟机将要部署爬虫业务,可能占用大量 IO,因此防患与未然,限制其虚拟机的磁盘 IO,以免影响其他虚拟机或者宿主机的正常读写。

鉴于我的经验以及公司运维团队规模,部署的是 KVM 虚拟化,通过 Libvirt 管理虚机,网络是桥接模式的 flat network,存储也是最简单的本地 LVM,很简单,没有上 OpenStack,然而底层原理都是一致的。OpenStack 中的 Cinder 可以对虚拟机的每块磁盘 IO 进行限速,包括:read/swrite/siops 等指标项,因此,KVM 也能支持磁盘 IO 限速。

qemu-kvm 磁盘限速参数

1
# qemu-kvm -drive file=/var/lib/libvirt/images/testvm.img,format=qcow2,if=none,id=drive-virtio-disk0,throttling.bps-read=10000000,throttling.bps-write=10000000

参数说明:

1
2
3
4
5
6
7
8
file: 硬盘路径
throttling.bps-read: 读字节每秒
throttling.bps-write: 写字节每秒
# 其他参数
throttling.bps-total: 读写总字节每秒
throttling.iops-total: 总 iops
throttling.iops-read:读 iops
throttling.iops-write:写 iops

qemu-kvm 是底层实现,这里通过 libvirt 管理虚拟机,因此通过 virsh 命令来做磁盘 IO 限速。

Libvirt 磁盘 IO 限速配置

1
2
3
4
5
6
7
8
9
# 查看虚拟机硬盘
# virsh domblklist testvm
Target     Source
------------------------------------------------
vda        /var/lib/libvirt/images/testvm.img
hda        -
# 对 vda 硬盘进行限速 读写都为 10 MB/s
# virsh blkdeviotune testvm vda --read-bytes-sec 10000000 --live
# virsh blkdeviotune testvm vda --write-bytes-sec 10000000 --live

--live 参数是立即生效,然而实际使用过程中发现无法生效,还是得修改虚机 xml 配置文件。

1
2
# virsh shutdown testvm
# virsh edit testvm

修改 xml 文件 disk 中增加 <iotune></iotune> 属性。

1
2
3
4
5
6
7
8
9
10
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/testvm.img'/>
      <target dev='vda' bus='virtio'/>
      <iotune>
        <read_bytes_sec>10000000</read_bytes_sec>
        <write_bytes_sec>10000000</write_bytes_sec>
      </iotune>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

虚拟机磁盘测速

1
2
3
4
5
6
7
8
9
10
# 写
# dd if=/dev/zero of=test.out bs=512 count=1000000 oflag=direct
# 读
# dd if=test.out of=/dev/null bs=512 count=1000000
# 在 dd 命令执行过程中通过 dstat 命令查看读写
# dstat -d 2
-dsk/total-
 read  writ
   0  9988k
# 符合 10 MB/s 的读写预期
This post is licensed under CC BY 4.0 by the author.