在openstack Grizzly版本中,其實已經內建了網絡的qos功能,之前一直沒有注意,有一個叫做instanc resource quota的功能:
https://wiki.openstack.org/wiki/InstanceResourceQuota
這個功能實作了CPU,disk IO和network IO的限流功能。 不過由于以下bug,真正可以正常工作的版本必須是2013.1.3以上版本。
https://bugs.launchpad.net/nova/+bug/1185030
另外, wiki上的指令中key是不準确的,key的值可以參考以下源碼:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1DOXlFd5YEZwY0ViZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO3ATOzkTM2ETMxETMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這些限流功能其實是libvirt本身就提供的,openstack在設定flavor時,可以想這些限流資訊設定好。當啟動虛機時,寫入虛機的/var/lib/nova/instance/XXX/libvirt.xml中就可以了。
我大緻實驗了一下發現效果還是比較明顯的,實驗步驟如下:
1. 建立flavor。
2. 使用以下指令設定網絡qos:
nova flavor-key matt_test set quota:vif_outbound_average=1024 ß outbound limit是 1024 kbyte
nova flavor-key matt_test set quota:vif_inbound_average=2048 ß inbound limit 是 2048 kbyte
3. 使用這個flavor啟動instance,測試上下行速度, 我使用的是netperf+iptraf。發現qos功能正常。
以下截圖是使用scp拷貝檔案,可以很明顯的看出效果:
無QoS,下行速度80MByte/s:
有QoS,下行速度2MByte/s左右:
可以看到libvirt.xml中添加了qos的資訊:
<interface type="bridge">
<mac address="fa:16:3e:40:85:d1"/>
<model type="virtio"/>
<source bridge="br101"/>
<filterref filter="nova-instance-instance-0000006c-fa163e4085d1"/>
<bandwidth>
<inbound average="2048"/>
<outbound average="1024"/>
</bandwidth>
</interface>
在host主機中使用tc指令發現在vnet0上設定了qos規則,看來libvirt也是使用host主機的TC來實作qos功能的:
# tc -s -d qdisc
…
qdisc htb 1: dev vnet0root refcnt 2 r2q 10 default 1 direct_packets_stat 0 ver3.17 ß Outbound QoS
Sent 310426919bytes 286434 pkt (dropped 0, overlimits 106276 requeues 0)
rate 0bit 0ppsbacklog 0b 0p requeues 0
qdisc ingress ffff: devvnet0 parent ffff:fff1 ---------------- ß Inbound QoS
Sent 191950889 bytes80382 pkt (dropped 806, overlimits 0 requeues 0)
rate 0bit 0ppsbacklog 0b 0p requeues 0
# tc class show devvnet0
class htb 1:1 root prio0 rate 16384Kbit ceil 16384Kbit burst 1597b cburst1597b