Cgroup 与虚拟机的 QoS
Linux Control Group 简介 一文介绍了如何使用 cgroup 限制进程的资源:cpu,memory,block IO 和 network IO。在宿主机看来,基于 qemu-kvm 的虚拟机就是一个进程,为了避免某些虚拟机占用过多的资源而影响了其它的虚拟机,业界常用 cgroup 限制虚拟机占用的资源。libvirt 是管理虚拟机的一个重要库,它同样依赖 cgroup 限制虚拟机的资源,本文介绍如何使用 libvirt 限制虚拟机的资源。
Limit CPU
<domain>
...
<cputune>
<shares>2048</shares>
<period>1000000</period>
<quota>-1</quota>
</cputune>
...
</domain>
- shares:相对权重,share 为 2048 的虚拟机获得的 CPU 时间以比 1024 的多一倍。
- quota:取值为 [1000, 18446744073709551],表示 CPU 的总配额
- period:取值为 [1000, max(1000000, quota)],表示在 quota 下,分配给虚拟机的 CPU 时间。
Limit Memory
<domain>
...
<memtune>
<hard_limit unit='G'>1</hard_limit>
<soft_limit unit='M'>128</soft_limit>
<swap_hard_limit unit='G'>2</swap_hard_limit>
<min_guarantee unit='bytes'>67108864</min_guarantee>
</memtune>
...
</domain>
以下 4 个参数可用于限制虚拟机的内存资源:
- hard_limit:虚拟机内存的硬上限(KB),qemu-kvm 强烈建议不设置该参数
- soft_limit:虚拟机内存的软上限(KB),只有当宿主机内存资源不足时才会限制虚拟机的内存
- swap_hard_limit:虚拟机 swap 分区上限(KB)
- min_guarantee:虚拟机占用宿主机的最低内存(KB),该参数仅支持 VMware ESX 和 OpenVZ
Limit Block IO
<domain>
...
<blkiotune>
<device>
<path>/dev/sda</path>
<read_bytes_sec>10000</read_bytes_sec>
<write_bytes_sec>10000</write_bytes_sec>
<read_iops_sec>20000</read_iops_sec>
<write_iops_sec>20000</write_iops_sec>
</device>
</blkiotune>
...
</domain>
以下 4 个参数可用于限制 block IO 资源。
- read_bytes_sec:虚拟机读带宽上限(Bytes/s)
- write_bytes_sec:虚拟机写带宽上限(Bytes/s)
- read_iops_sec:虚拟机每秒读块设备次数上限
- write_iops_sec:虚拟机每秒写块设备次数上限
Note:非本地存储的虚拟机由于走的是网络 IO,无法用此方法限速,可以采用 dom.setBlockIoTune() 方法限制其 block IO。
Limit Network IO
<domain>
<devices>
<interface type='network'>
<source network='default'/>
<target dev='vnet0'/>
<bandwidth>
<inbound average='1000' peak='5000' floor='200' burst='1024'/>
<outbound average='128' peak='256' burst='256'/>
</bandwidth>
</interface>
</devices>
...
</domain>
限制入口流量的参数有:
- average:平均带宽(KB/s)
- peak:峰值带宽(KB/s)
- burst:峰值速率时接收流量的上限(KB)
- floor:能保证的最低流量(KB)
限制出口流量的参数有:
- average:平均带宽(KB/s)
- peak:峰值带宽(KB/s)
- burst:峰值速率时发送流量的上限(KB)