Mininet を使用してデータセンターのルーティングアルゴリズムをテストしたいと考えています。トラフィックは、特定のパラメーターに準拠する必要があります。
- さまざまなサイズの「ファイル」で構成する必要があります (これらは実際にファイルである必要はないことに注意してください。サイズが制御可能である限り、たとえば iperf で生成されるトラフィックは問題ありません)。
- ファイル サイズは、特定のディストリビューションから取得する必要があります。
- データが送信されるソース/宛先ホストのペアは、特定のファイルに対してランダムに選択する必要があります。
- ファイルが送信されてから後続のファイルが送信されるまでの間隔はランダムにする必要があります。と
- 転送に時間がかかる 2 つのホスト間で巨大なファイルが送信された場合でも、ネットワーク内の他のホスト間でデータを送信できるはずです。
ポイント1~4はお世話になっています。私は何日も #5 に苦労してきましたが、正しく動作させることができません。私の最初の考えは、サブプロセス/スレッドを生成して、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()
これを行うには、クライアントのコマンドが完了するまで待つ必要があります。
この作業を行うために何ができるかについてのアドバイスをいただければ幸いです。