大家好,关于KVM虚拟机网络资源限制很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
2. 限制通过TC的虚拟机流量。 TC是限制网络流量的内核机制;
3 通过Libvirt限制虚拟机流量;
4 通过iptables 限制虚拟机流量。
为了对比网络限流的效果,我们先介绍一下不限流的网络测试情况。测试环境的主机为千兆网卡。在没有限制的情况下,使用netperf测试虚拟机的结果如下:
# netperf -t TCP_STREAM -H 10.69.68.161 -p 12865 -l 60
TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.69.68.156 (10.69.68.156) 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.01 947.97
可以看到,基本可以达到线速度。
使用TC(Traffic Control)限制虚拟机带宽
TC(Traffic Control)是一个Linux流量控制工具,可以控制网络接口发送数据的速率。每个网络接口都有一个用于管理和调度待处理数据的队列。 TC的工作原理是通过设置不同类型的网络接口队列来改变数据包传输的速率和优先级,从而达到流量控制的目的。
Linux内核支持的队列有:
1 TBF,Token Bucket Flow令牌桶过滤器,适用于流量整形。
2 Pfifo_fast,第三带先进先出队列先进先出队列。
3 CBQ队列,分类队列,用于实现精细的qos控制,配置复杂;
4 SFQ,Stochastic Fairness Queuing 随机公平队列。
5 HTB,Hierarchy Token Bucket,用于实现精细的qos控制,配置比CBQ简单。
TC主要控制出口流量,入口流量不能用TC控制。
通过TC限制网卡流量
1)通过TBF限制流出速度示例:
#tc qdisc add dev eth0 root tbf 速率51200kbit 延迟50ms minburst 200k 突发200k
限制网卡eth0的流出速度为51200kbit。正确的设置方法与minburst参数有很大关系。不同的硬件环境和系统需要具体的调试。
删除队列命令:
tc qdisc del dev eth0 root tbf
修改队列的命令:
tc qdisc 更改dev eth0 root tbf 速率2200kbit 延迟5000ms 突发1540
查看当前队列
tc -s -d qdisc ls
2)通过HTB队列,对不同IP源进行限速
创建htb根队列:
tc qdisc 添加dev eth0 根句柄1: htb
创建父类1:1,速度为100mbit:
tc 类添加dev eth0 父级1: classid 1:1 htb 速率100mbit ceil 100mbit
创建子类1:10,速度为50mbit。这里的50mbit包含在1:1的100mbit中:
tc 类添加dev eth0 父级1:1 classid 1:10 htb 速率50mbit ceil 50mbit
指定1:10是一个随机公平队列:
tc qdisc 添加dev eth0 父级1:10 sfq 扰动10
通过过滤器,确保ip 1.1.1.1通过队列1:1,优先级为2:
tc 过滤器添加dev eth0 协议ip 父级1: prio 2 u32 匹配ip dst 1.1.1.1/32 flowid 1:1
通过过滤器,确保所有其他IP都通过队列1:10,优先级为50:
tc 过滤器添加dev eth0 协议ip 父级1: prio 50 u32 匹配ip dst 0.0.0.0/0 flowid 1:10
通过TC限制虚拟机流量
通过TC限流来限制虚拟机的流量,分为以下步骤:
1)创建队列;
2)建立分类;
3)建立过滤器,过滤虚拟机的IP;
4)绑定网卡。
以下是限制主机网卡流量的脚本:
#!/bin/bash
发展=em1
tc qdisc del dev $DEV 根
tc qdisc add dev $DEV 根句柄1: cbq avpkt 1000 带宽1000mbit
tc 类添加dev $DEV 父级1: classid 1:1 cbq 速率100kbit 分配1500 prio 5 有界隔离
tc 过滤器添加dev $DEV 父级1: 协议ip prio 16 u32 匹配ip src 10.0.0.161 flowid 1:1
tc qdisc 添加dev $DEV 父级1:1 sfq 扰动10
其中DEV是与虚拟机桥接的主机网卡的名称。测试结果如下:
# netperf -t TCP_STREAM -H 10.0.0.161 -p 12865 -l 60
TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.0.0.161 (10.0.0.161) 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 14.00 0.09
流量基本限制在100k以内。
使用Libvirt 限制虚拟机带宽
Libvirt的虚拟机流量限制配置起来非常方便。将以下段落添加到虚拟机配置文件的网卡部分:
带宽
入站平均值=’100’峰值=’50’突发=’1024’/
出站平均=’100’峰值=’50’突发=’1024’/
/带宽
目标是将传入和传出带宽限制为平均不超过100(千字节/秒),最大不超过50(千字节/秒)。实际结果与预期不同。测试结果如下:
流入几乎没有影响:
#netperf -H 10.0.0.161 -l 60
将TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.0.0.161 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.01 820.58
流出量为177.55M:
#netperf -H 10.0.0.167 -l 20
TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.0.0.167 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 20.02 177.55
Libvirt 实际上使用TC。当虚拟机配置生效后,可以通过TCqueue命令查看TC队列:
tc -s -d qdisc ls
.
qdisc pfifo_fast 0: dev virbr0-nic root refcnt 2 band 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
发送614 字节8 个包(丢弃0 个、超出限制0 个、重新排队0 个)
积压0b 0p 重新排队0
qdisc htb 1: dev macvtap0 root refcnt 2 r2q 10 默认1 direct_packets_stat 0 版本3.17
发送468 字节6 个包(丢弃0 个、超出限制0 个、重新排队0 个)
积压0b 0p 重新排队0
qdisc sfq 2: dev macvtap0 父级1:1 限制127p 量子1514b 深度127 流128/1024 除数1024 扰动10 秒
发送468 字节6 个包(丢弃0 个、超出限制0 个、重新排队0 个)
积压0b 0p 重新排队0
qdisc 入口ffff: dev macvtap0 父ffff:fff1 —————-
发送0 字节0 个包(丢弃0 个、超出限制0 个、重新排队0 个)
积压0b 0p 重新排队0
因为TC只能限制流出方向,而不能限制流入方向,所以通过Libvirt限制流量实际上只能限制流出方向。
使用iptables限制虚拟机发包速率
通过iptables限制虚拟机传入方向的发包速率
在主机上使用iptables来限制虚拟机的数据包发送速率也是限制虚拟机传入流量的有效解决方案。
默认情况下,桥接的虚拟机网络流量不受主机的iptables控制,需要更改一个内核参数:
# echo 1 /proc/sys/net/bridge/bridge-nf-call-iptables
然后添加两条iptables规则:
iptables -A FORWARD -d 10.0.0.161 -m limit –limit 100/sec –limit-burst 100 -j ACCEPT
#限制每秒100个数据包
iptables -A 转发-d 10.0.0.161 -j 删除
同时对下游进、出口方向的流量进行了测试,测试结果如下:
流入方向流量明显受到限制,只有2.06M:
#netperf -H 10.20.102.161 -l 60
将TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.20.102.161 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.01 2.06
流出方向的流量也明显受到限制,为213.50M
#netperf -H 10.0.0.167 -l 60
TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.0.0.167 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.23 213.50
通过iptables限制虚拟机传入方向的发包速率
iptables -A FORWARD -s 10.0.0.161 -m limit –limit 100/sec –limit-burst 100 -j ACCEPT
#限制虚拟机源地址每秒100个数据包
iptables -A 转发-s 10.0.0.161 -j 删除
测试结果如下:
流入流量明显受到限制,为19.31M:
netperf -H 10.20.102.161 -l 60
将TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.20.102.161 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.49 19.31
流出方向流量也限制为1.58M:
netperf -H 10.20.102.167 -l 60
将TCP 流测试从0.0.0.0 (0.0.0.0) 端口0 AF_INET 迁移到10.20.102.167 () 端口0 AF_INET
接收发送发送
套接字套接字消息已过
尺寸尺寸尺寸时间吞吐量
字节字节字节秒。 10^6位/秒
87380 16384 16384 60.63 1.58
iptables限流总结
1 通过iptables无法精确控制网络速度,只能控制数据包数量。具体数量可以通过mtu乘以数据包数量来计算;
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/102402.html
用户评论
一别经年
这篇文章写的真好!正好我最近在研究KVM虚拟机的网络设置,一直在纠结如何控制每个虚拟机的带宽使用量,现在总算是找到了合适的方案了。
有12位网友表示赞同!
心悸╰つ
KVM的网络资源限制确实是一个重要的配置项,要是没有做好限制,很容易让一台虚拟机占用太多资源,影响到其它虚拟机性能。这篇文章讲得很好,让我对使用网桥、虚拟交换机等技术更加清晰。
有7位网友表示赞同!
烟雨离殇
刚开始用KVM虚拟机的时候,完全没注意网络资源的配置问题,差点就因为一台虚拟机抢占了所有带宽而导致整个系统崩溃!幸好及时找到了这篇文章解决我的困惑。
有15位网友表示赞同!
短发
文章提到的流量控制方式很有帮助,但对于复杂的多台虚拟机环境,好像需要更专业的解决方案吧?是否有一种更全面的方法可以更好地管理虚拟机的网络资源呢?
有19位网友表示赞同!
你的眸中有星辰
KVM虚拟机太酷了!学习了这篇文章之后,我可以更好地利用它来进行开发测试和部署一些小型应用。
有13位网友表示赞同!
嗯咯
这篇文章没有提很多关于 KVM 的详细操作步骤,我比较想要看具体例子或者一些配置参数的说明,以便更快地上手。
有15位网友表示赞同!
逃避
说来说去,还是觉得物理服务器更可靠一些,虚拟机的网络问题总是让人头疼,而且管理起来也有些麻烦。
有9位网友表示赞同!
盲从于你
我已经按照文章的教程设置了虚拟交换机和带宽限制,现在系统的性能明显提升了许多,虚拟机之间的互相干扰不再那么严重!
有10位网友表示赞同!
北朽暖栀
这篇文章给了我很棒的建议,让我学会了如何更好地控制每个虚拟机的网络资源使用量,我的工作效率有了很大的提高。
有16位网友表示赞同!
容纳我ii
网桥模式和虚拟交换机这种技术真是太棒了,可以为每个虚拟机定制单独的网络环境!非常适合做一些安全测试或者隔离实验。
有7位网友表示赞同!
拥抱
我觉得KVM虚拟机的网络资源限制功能还是不够完善吧? 难道没有更便捷的方式来管理不同虚拟机之间的带宽分配吗?
有12位网友表示赞同!
发型不乱一切好办
在Linux系统里玩转KVM虚拟机真是太棒了!这篇文章让我对网络资源限制有了更深刻的理解,可以更好地控制各种虚拟机之间的流量。
有17位网友表示赞同!
一生只盼一人
这篇文章虽然讲得很好,但是我有点基础比较薄弱,对于网桥、虚拟交换机的原理不太了解,能否提供一些更浅显易懂的解释呢?
有15位网友表示赞同!
凉凉凉”凉但是人心
感觉管理KVM虚拟机的网络资源还是需要一定的技巧和经验啊,这篇文章只是给了个大概,还需要多实践才能真正掌握。
有15位网友表示赞同!
独角戏°
我很赞同文章里提到的流量控制方法,对于防止某些虚拟机占用过多的带宽是非常有帮助的!
有11位网友表示赞同!
眷恋
KVM虚拟机的网络配置确实比较复杂,尤其是针对不同类型的虚拟机,需要根据需求进行不同的设置,这篇文章只是给了个基础的框架,还需要进一步学习和探索。
有18位网友表示赞同!
岁岁年年
我觉得这篇文章很有用,对想要了解 KVM 网络限制规则的人来说绝对是必读!
有7位网友表示赞同!
?亡梦爱人
学习KVM虚拟机,为了安全起见,一定要注意网络资源限制设置,避免被恶意攻击或者病毒入侵。
有6位网友表示赞同!