数据中心两种常用流量模型运用 mininet 的实现

发布于 2024-12-29 05:16:34 字数 7314 浏览 7 评论 0

编者按: 在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。本文就以数据中心网络为目标场景,来在 mininet 仿真环境中尽可能地还原数据中心内部的真实流量情况。目前有两种常用的流量模型:

  • 随机模型 :主机向在网络中的另一任意主机以等概率发送数据包
  • 概率模型 :在网络中,编号为 m 的主机分别以概率 Pt 、Pa 、Pc 、向主机编号为(m+i)、(m+j)、(m+k) 的主机发送数据包

data center two model in mininet realized

我们使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

ゞ记忆︶ㄣ

暂无简介

文章
评论
26 人气
更多

推荐作者

xiaolangfanhua

文章 0 评论 0

qq_r4YSZQ

文章 0 评论 0

1PKOH46yx8j0x

文章 0 评论 0

酷到爆炸

文章 0 评论 0

梦言归人

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文