[環境搭建]mininet中實現隨機流量模型,20180130
[環境搭建]mininet中實現隨機流量模型
本文記錄了如何實現“mininet拓撲中任意一臺主機以等概率隨機向另外一臺主機發送一條UDP數據流,並將iperf測試結果自動保存到文件”的方法,概括來說則是“為mininet設置一條可實現上述功能的自定義命令‘iperfmulti’”。
1.添加自定義函數及自定義命令
使用nano編輯器打開並編輯“***/mininet/net.py”文件,輸入命令:
nano ***/mininet/net.py
註:由於個人的mininet文件夾所在目錄不同,故後文都用“***”表示該部分路徑。
在“Mininet”類的類體中添加自定義函數“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 + ‘ ‘ """ 設置UDP模式發送的帶寬大小 """
print "***start server***"
server.cmd( iperfArgs + ‘-s -i 1‘ + ‘ > /home/zg/log/‘ + filename + ‘&‘) """ 1.在此編輯服務器端的iperf命令,添加需要的參數;2.設置iperf命令的輸出結果被保存到的路徑 """
print "***start client***"
client.cmd(
iperfArgs + ‘-t ‘+ str(period) + ‘ -c ‘ + server.IP() + ‘ ‘ + bwArgs
+‘ > /home/zg/log/‘ + ‘client‘ + filename +‘&‘) """ 1.在此編輯客戶端的iperf命令,添加需要的參數;2.設置iperf命令的輸出結果被保存到的路徑 """
下圖是“***/mininet/net.py”文件中“Mininet”類部分代碼的截圖:
將自定義函數“iperf_single”的代碼添加到“Mininet”類的類代碼中:
需要註意的一點是Python語句的縮進,如 ,
“def”前應有4個空格,同時,“def”下面的語句也應保持正確的縮進。
在“Mininet”類的類體中添加自定義命令代碼“iperfmulti”:
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"
仍需註意的是Python語句的縮進。
添加代碼後如圖所示:
保存“***/mininet/net.py”文件,退出nano編輯器
在鍵盤上按“CTRL+X”,編輯器下方顯示出“是否需要保存”的提示信息,如圖:
按一次“Y”鍵,再按一次“ENTER”鍵,即可保存“***/mininet/net.py”文件同時退出nano編輯器。
2.在CLI類中令註冊自定義命
修改“***/mininet/mininet/cli.py”文件
使用nano編輯器打開並編輯“***/mininet/mininet/cli.py”文件,輸入命令:
nano ***/mininet/mininet/cli.py
在nano編輯器中添加代碼:
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‘)
註:代碼需要添加在“CLI”類的類體中。
在鍵盤上依次按下“CTRL+X”、“Y”鍵、“ENTER”鍵,即可保存“***/mininet/mininet/cli.py”文件同時退出nano編輯器。
3.在mininet執行解釋器中註冊自定義命令與對應執行函數的映射關系
修改“***/mininet/bin/mn”文件
使用nano編輯器打開並編輯“***/mininet/bin/mn”文件,輸入命令:
nano ***/mininet/bin/mn
找到“ALTSPELLING”,添加“iperfmulti”及“iperfMulti”如圖紅框部分:
4.重新編譯mininet
輸入命令:
/***/mininet/util/install.sh -n
5.如何使用自定義命令“iperfmulti”
命令格式: iperfmulti <帶寬>
例如:
iperfmulti 150M
輸入命令並觀察到終端輸出“test has done”後(如上圖),可查看測試結果,由前文自定義函數“iperf_single”的代碼可知,測試結果保存在目錄"/home/zg/log"下。
觀察"/home/zg/log"目錄下有什麽文件,使用以下2條命令:
cd /home/zg/log
ls
由上圖知,輸出了4個文件,分別對應server1,server2,client1,client2的帶寬測試輸出文件。輸出4個文件是由於作者使用了mininet默認的網絡拓撲做實驗,網絡中只有兩臺主機,這兩臺主機分別各當了一次server、client,因此共有兩組輸出文件。
查看iperf測試結果,使用命令“cat <文件名>”,例如:
cat 1.out
觀察到輸出結果:
[環境搭建]mininet中實現隨機流量模型,20180130