转载自http://www.cnblogs.com/lin-victor/archive/2012/05/14/2499101.html
关于如何限制虚拟机的网络流量问题,可以使用linux下的TC (traffic control),关于如何使用linux的tc命令参加下面几个链接:
利用TC命令为KVM限制各VM的网卡带宽 :http://www.fuwuqiweihu.com/iproute-tc-kvm-vm-network-limit/
TC控制流量: http://www.chinaunix.net/jh/4/350969.html
http://www.bitscn.com/os/linux/201003/183181_7.html
http://www.chinaz.com/server/2009/0807/85806.shtml
发现ubuntu已有tc命令于是:
输入命令:
tc qdisc add dev eth0 root tbf rate 10Mbit latency 50ms burst 10000 mpu 64 mtu 150000
出现错误:
RTNETLINK answers: No such file or directory
问题出在相关模块没有加载,遂查找流量控制内核选项要求 http://linux-ip.net/articles/Traffic-Control-HOWTO/ 第5章 Software and tools 中有介绍 “Kernel requirements”:
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y
重新按照上述要求编译内核,重启后问题解决。
相关信息及测试数据:
系统版本: Linux nc2 3.2.0-rc3 #4 SMP Mon May 14 17:09:56 CST 2012 i686 GNU/Linux
未流量控制前信息:
root@nc2:~/lguest/botnet_lguest# tc -s qdisc ls dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 10413 bytes 86 pkt (dropped 0, overlimits 0 requeues 0)
测试网络流量:
root@nc2:~/start-kvm# scp ubuntu161.img root@nc1:/root
ubuntu161.img 20% 539MB 63.3MB/s 00:33 ETA
吞吐量为63.3MB/s
执行流量控制:
root@nc2:~/start-kvm# tc qdisc add dev eth0 root tbf rate 10Mbit latency 50ms burst 10000 mpu 64 mtu 150000
执行流量控制后信息:
root@nc2:~/start-kvm# tc qdisc ls dev eth0
qdisc tbf 8003: root refcnt 2 rate 10000Kbit burst 9997b lat 50.0ms
测试网络流量:
root@nc2:~/start-kvm# scp ubuntu161.img root@nc1:/root
ubuntu161.img 0% 18MB 1.2MB/s 36:13 ETA
吞吐量为1.2MB/s
测试结果显示流量控制成功!
Note: linux 下的流量控制只控发不控收,因此假设linux虚拟机的虚拟eth0 对应的TUN/TAP端口名称为tap0, 则如何对虚拟eth0实行TC控制,控制的是虚拟机的发包,如果对tap0设置TC控制则是对间接对虚拟机的接包进行控制。
通过命令 'tc qdisc ls dev eth0'