3

Mininet を使用してデータセンターのルーティングアルゴリズムをテストしたいと考えています。トラフィックは、特定のパラメーターに準拠する必要があります。

  1. さまざまなサイズの「ファイル」で構成する必要があります (これらは実際にファイルである必要はないことに注意してください。サイズが制御可能である限り、たとえば iperf で生成されるトラフィックは問題ありません)。
  2. ファイル サイズは、特定のディストリビューションから取得する必要があります。
  3. データが送信されるソース/宛先ホストのペアは、特定のファイルに対してランダムに選択する必要があります。
  4. ファイルが送信されてから後続のファイルが送信されるまでの間隔はランダムにする必要があります。と
  5. 転送に時間がかかる 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()これを行うには、クライアントのコマンドが完了するまで待つ必要があります。

この作業を行うために何ができるかについてのアドバイスをいただければ幸いです。

4

1 に答える 1

0

ここからヒントを得て、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)

これは、マルチプロセッシングやスレッド化で経験した問題 (セッションが終了した後にネットワークを切断したり、ネットワークがブロックされるべきではないときにブロックしたりするなど) なしで機能します。

于 2015-07-28T14:01:22.960 に答える