数据中心两种常用流量模型运用 mininet 的实现
编者按: 在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。本文就以数据中心网络为目标场景,来在 mininet 仿真环境中尽可能地还原数据中心内部的真实流量情况。目前有两种常用的流量模型:
- 随机模型 :主机向在网络中的另一任意主机以等概率发送数据包
- 概率模型 :在网络中,编号为 m 的主机分别以概率 Pt 、Pa 、Pc 、向主机编号为(m+i)、(m+j)、(m+k) 的主机发送数据包
我们使用 mininet 中的 iperf 工具在网络中生成 UDP 流量,iperf 客户端传送数据流到 iperf 的服务端,由服务端接收并记录相关信 息。mininet 自带控制台可供使用的命令虽然已经比较丰富,但却并未给出较为明确的 API 接口来支持用户自定义命令。在诸如数据中心这样复杂、网络节 点较多的仿真环境中做一些批处理的工作就需要非常大的,比如通过 iperf 在所有主机之间发生流量。所以我们需要将自定义命令添加到 mininet 中,在 mininet 中完成新命令的拓展。
一、 mininet 功能拓展
在 mininet 中进行功能拓展主要分为 3 步:
1. 修改 mininet/net.py: net 模块实现 Mininet 类,是仿真平台 mininet 的主体类,该类完成节点添加配置、网络基本功能和一些选项功能的实现。我们需要将我们自定义的函数定义在该类中。
class Mininet(object):
def function(self,**kwargs):
#function code
2. 修改 mininet/cli.py: cli 模块定义了 CLI 类,为米你呢他提供命令行接口,用于解析用户输入的命令,之前定义的自定义命令需要在 CLI 类中通过注册函数注册这条自定义命令。
class CLI(Cmd):
def do_function(self,line):
#do_function code
完成命令注册与绑定。
3. 修改 bin/mn: 在完成命令注册与绑定后,需要在 mininet 执行解释器中注册命令与对应执行函数的映射关系。
ALTSPELLING = {'pingall':'pingAll',
'pingpair':'pingPair',
'iperfudp':'iperfUdp',
'function':'function'}
net.py 和 cli.py 均在 mininet/mininet 目录,mn 文件在在 mininet/bin 目录中。在代码修改完成后需要重新编译安装一遍 mininet,即运行:
$~/mininet/util/install.sh -n
二、 两种流量模型在 mininet 中的实现
2.1 随机模型
任意一台主机以等概率随机地向另外一台主机发起一条 UDP 数据流。
修改 mininet/net.py
首先,先在两个主机之间进行 iperf 测试,并且在 server 端记录,实现 iperf_single 函数:
def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001):
"""Run iperf between two hosts using UDP.
hosts: list of hosts; if None, uses opposite hosts
returns: results two-element array of server and client speeds"""
if not hosts:
return
else:
assert len( hosts ) == 2
client, server = hosts
filename = client.name[1:] + '.out'
output( '*** Iperf: testing bandwidth between ' )
output( "%s and %s\n" % ( client.name, server.name ) )
iperfArgs = 'iperf -u '
bwArgs = '-b ' + udpBw + ' '
print "***start server***"
server.cmd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&')
print "***start client***"
client.cmd(
iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
+' > /home/zg/log/' + 'client' + filename +'&')
着为 mininet 添加自定义命令 iperfmulti,依次为每一台主机随机选择另一台主机作为 iperf 的服务器端,通过调用 iperf_single,自身以客户端身份按照指定参数发送 UDP 流,服务器生成的报告以重定向的方式输出到文件中,使用 iperfmulti 命令,主 机随机地向另一台主机发起一条恒定带宽的 UDP 数据流。
def iperfMulti(self, bw, period=60):
base_port = 5001
server_list = []
client_list = [h for h in self.hosts]
host_list = []
host_list = [h for h in self.hosts]
cli_outs = []
ser_outs = []
_len = len(host_list)
for i in xrange(0, _len):
client = host_list[i]
server = client
while( server == client ):
server = random.choice(host_list)
server_list.append(server)
self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)
sleep(.05)
base_port += 1
sleep(period)
print "test has done"
修改 mininet/cli.py
def do_iperfmulti( self, line ):
"""Multi iperf UDP test between nodes"""
args = line.split()
if len(args) == 1:
udpBw = args[ 0 ]
self.mn.iperfMulti(udpBw)
elif len(args) == 2:
udpBw = args[ 0 ]
period = args[ 1 ]
err = False
self.mn.iperfMulti(udpBw, float(period))
else:
error('invalid number of args: iperfmulti udpBw period\n' +
'udpBw examples: 1M 120\n')
修改 bin/mn
在 mininet/bin 目录下修改 mn 文件,将 iperfpb 加入到对应的列表中。
ALTSPELLING = { 'pingall': 'pingAll',
'pingpair': 'pingPair',
'iperfudp': 'iperfUdp',
'iperfUDP': 'iperfUdp',
'iperfpb':'iperfPb' }
最后,进入 mininet/util 目录,重新编译安装 mininet
$~/mininet/util/install.sh -n
重启 mininet,输入 iperf,可用 table 补全 iperfpb,从而可使用 iperfpb 进行流量随机模型的测试。
2.2 概率模型
为 mininet 添加自定义命令 iperfpb,依次为每一台主机(编号为 m)分别以概率 Pt 、Pa 、Pc 向主机编号为(m+i)、(m+j)、(m+k) 的主机发送数据包,通过调用 iperf_single,自身以客户端身份按照指定参数发送 UDP 流,服务 器生成的报告以重定向的方式输出到文件中,使用 iperfpb 命令,主机按概率向其他被选择的主机发起一条恒定带宽的 UDP 数据流。
概率选择函数
为完成以一定概率选择主机,我们需要实现一个概率选择函数 randompick,这个函数可用于以不同的概率从一个列表中随机地选择一些元素。下面为 randompick 的实现过程:
def random_pick( self, _list, probabilities):
x = random.uniform(0,1)
p = None
cumulative_probability = 0.0
for item, item_probability in zip(_list, probabilities):
cumulative_probability += item_probability
p = item
if x < cumulative_probability:break
return p
修改 mininet/net.py
base_port = 5001
server_list = []
client_list = []
client_list = [h for h in self.hosts]
cli_outs = []
ser_outs = []
host_list = []
host_list = [h for h in self.hosts]
pc = 1 - pt - pa
p_list = [pt,pa,pc]
_len = len(self.hosts)
for key in xrange(_len):
client = host_list[key]
access_host = [host_list[(key+i)%_len],host_list[(key+j)%_len],host_list[(key+k)%_len]]
server = self.random_pick(access_host,p_list)
server_list.append(server)
self.iperf_single(hosts = [client, server], udpBw=bw, port=base_port)
sleep(.05)
sleep(period)
print "test has done"
修改 mininet/cli.py
def do_iperfpb(self, line):
"""Multi iperf UDP test with probablity"""
args = line.split()
if len(args) == 1:
udpBw = args[ 0 ]
self.mn.iperfMulti(udpBw)
elif len(args) == 2:
udpBw = args[ 0 ]
period = args[ 1 ]
err = False
self.mn.iperfPb(udpBw, float(period))
else:
error('invalid number of args: iperfmulti udpBw period\n' +
'udpBw examples: 1M 120\n')
修改 bin/mn
在 mininet/bin 目录下修改 mn 文件,将 iperfpb 加入到对应的列表中。
ALTSPELLING = { 'pingall': 'pingAll',
'pingpair': 'pingPair',
'iperfudp': 'iperfUdp',
'iperfUDP': 'iperfUdp',
最后,进入 mininet/util 目录,重新编译安装 mininet:
$~/mininet/util/install.sh -n
重启 mininet,输入 iperf,可用 table 补全 iperfpb,从而可使用 iperfpb 进行流量的概率模型的测试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论