通过 Mininet 网络发送 "random" 流量
Sending "random" traffic through Mininet network
我想使用 Mininet 测试数据中心路由算法。流量需要符合某些参数:
- 应该是"files"大小不等的(注意不一定非得是文件,iperf等产生的流量是可以的,只要大小可控即可);
- 文件大小应该来自特定的分布;
- 发送数据的source/destination 主机对应为给定文件随机选择;
- 发送一个文件和发送其后续文件之间的时间间隔应该是随机的;和
- 如果需要很长时间才能在两台主机之间发送一个巨大的文件,那么在网络中的其他主机之间应该仍然可以发送数据。
第 1-4 点已处理完毕。几天来我一直在与#5 作斗争,但我无法让它正常工作。我最初的想法是生成 subprocesses/threads 以向主机发送 iperf 命令:
while count < 10:
if (count % 2) == 0:
host_pair = net.get("h1", "h2")
else:
host_pair = net.get("h3", "h4")
p = multiprocessing.Process(target=test_custom_iperf, args=(net, host_pair, nbytes))
p.daemon = True
p.start()
time.sleep(random.uniform(0, 1))
命令 test_custom_iperf 模仿 Python Mininet API 的 iperf 版本以包含 -n
传输大小参数:
client, server = host_pair
print client, server
output( '*** Iperf: testing TCP bandwidth between',
client, 'and', server, '\n' )
server.sendCmd( 'iperf -s' )
if not waitListening( client, server.IP(), 5001 ):
raise Exception( 'Could not connect to iperf on port 5001' )
cliout = client.cmd( 'iperf -c ' + server.IP() + ' -n %d' % nbytes )
print cliout
server.sendInt()
servout = server.waitOutput()
debug( 'Server output: %s\n' % servout)
result = [ net._parseIperf( servout ), net._parseIperf( cliout ) ]
output( '*** Results: %s\n' % result )
实现非阻塞非常困难。由于某种原因,我需要能够发送 server.sendInt()
命令,为此我需要等待客户端的命令完成。
对于我可以尝试使这项工作成功的任何建议,我将不胜感激!
我得到了 here 的提示并使用了 Mininet 的 host.popen() 模块来发送数据。希望这对其他人有帮助:
def send_one_file(file_dir, host_pair, files):
src, dst = host_pair # a tuple of Mininet node objects
# choose a random file from files
rand_fname = random.sample(files, 1)[0]
rand_path = os.path.join(file_dir, rand_fname)
port = random.randint(1024, 65535)
# Start listening at the destination host
dst_cmd = 'nc -l %d > /home/mininet/sent/%s.out' % (port, rand_fname)
print os.path.getsize(rand_path)
dst.popen( dst_cmd, shell=True )
# Send file from the source host
src_cmd = 'nc %s %s < %s' % (dst.IP(), port, rand_path)
src.popen( src_cmd, shell=True )
然后父函数随机调用send_one_file():
def test_netcat_subprocess_async(net, duration):
file_dir = "/home/mininet/sf_mininet_vm/data/MVI_0406_split"
files = os.listdir(file_dir)
start_time = time.time()
end_time = start_time + duration
# Transfer for the desired duration
while time.time() < end_time:
# Choose a pair of hosts
host_pair = random.sample(net.hosts, 2)
test_send_one_file_netcat(file_dir, host_pair, files)
interval = random.uniform(0.01, 0.1)
print "Initialized transfer; waiting %f seconds..." % interval
time.sleep(interval)
这没有我在多处理或线程方面遇到的任何问题(在会话结束后断开网络,在不应该的时候阻塞,等等)。
我想使用 Mininet 测试数据中心路由算法。流量需要符合某些参数:
- 应该是"files"大小不等的(注意不一定非得是文件,iperf等产生的流量是可以的,只要大小可控即可);
- 文件大小应该来自特定的分布;
- 发送数据的source/destination 主机对应为给定文件随机选择;
- 发送一个文件和发送其后续文件之间的时间间隔应该是随机的;和
- 如果需要很长时间才能在两台主机之间发送一个巨大的文件,那么在网络中的其他主机之间应该仍然可以发送数据。
第 1-4 点已处理完毕。几天来我一直在与#5 作斗争,但我无法让它正常工作。我最初的想法是生成 subprocesses/threads 以向主机发送 iperf 命令:
while count < 10:
if (count % 2) == 0:
host_pair = net.get("h1", "h2")
else:
host_pair = net.get("h3", "h4")
p = multiprocessing.Process(target=test_custom_iperf, args=(net, host_pair, nbytes))
p.daemon = True
p.start()
time.sleep(random.uniform(0, 1))
命令 test_custom_iperf 模仿 Python Mininet API 的 iperf 版本以包含 -n
传输大小参数:
client, server = host_pair
print client, server
output( '*** Iperf: testing TCP bandwidth between',
client, 'and', server, '\n' )
server.sendCmd( 'iperf -s' )
if not waitListening( client, server.IP(), 5001 ):
raise Exception( 'Could not connect to iperf on port 5001' )
cliout = client.cmd( 'iperf -c ' + server.IP() + ' -n %d' % nbytes )
print cliout
server.sendInt()
servout = server.waitOutput()
debug( 'Server output: %s\n' % servout)
result = [ net._parseIperf( servout ), net._parseIperf( cliout ) ]
output( '*** Results: %s\n' % result )
实现非阻塞非常困难。由于某种原因,我需要能够发送 server.sendInt()
命令,为此我需要等待客户端的命令完成。
对于我可以尝试使这项工作成功的任何建议,我将不胜感激!
我得到了 here 的提示并使用了 Mininet 的 host.popen() 模块来发送数据。希望这对其他人有帮助:
def send_one_file(file_dir, host_pair, files):
src, dst = host_pair # a tuple of Mininet node objects
# choose a random file from files
rand_fname = random.sample(files, 1)[0]
rand_path = os.path.join(file_dir, rand_fname)
port = random.randint(1024, 65535)
# Start listening at the destination host
dst_cmd = 'nc -l %d > /home/mininet/sent/%s.out' % (port, rand_fname)
print os.path.getsize(rand_path)
dst.popen( dst_cmd, shell=True )
# Send file from the source host
src_cmd = 'nc %s %s < %s' % (dst.IP(), port, rand_path)
src.popen( src_cmd, shell=True )
然后父函数随机调用send_one_file():
def test_netcat_subprocess_async(net, duration):
file_dir = "/home/mininet/sf_mininet_vm/data/MVI_0406_split"
files = os.listdir(file_dir)
start_time = time.time()
end_time = start_time + duration
# Transfer for the desired duration
while time.time() < end_time:
# Choose a pair of hosts
host_pair = random.sample(net.hosts, 2)
test_send_one_file_netcat(file_dir, host_pair, files)
interval = random.uniform(0.01, 0.1)
print "Initialized transfer; waiting %f seconds..." % interval
time.sleep(interval)
这没有我在多处理或线程方面遇到的任何问题(在会话结束后断开网络,在不应该的时候阻塞,等等)。