---- 0-TH SEC: ----
<--------------------------| | | |<-------------------CUBIC
| | 500ms | |
CUBIC--------------------->| | ^^^^^5ms | |------------------------>
| | 10ms| | | |
| |---120Mbps,20ms--| |
| | | |
| | 15-TH SEC: | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
| | | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
---- 30 SECS ----
CoCo-Beholder は、あらゆるサイズの一般的なダンベル トポロジを提供する、人に優しい仮想ネットワーク エミュレーターです。トポロジの各リンクには、個別の速度、遅延、およびキュー サイズが設定される場合があります。中央リンクには、オプションのジッターを伴う可変遅延も含まれる場合があります。異なるスキームのフローは、指定された秒数の実行時間の間、トポロジ内で一緒に実行できます。フローごとに、その方向とランタイムの開始秒を選択できます。
各フローにはトポロジの左半分にホストがあり、右半分にホストがあり、ホストは 1 つのホストが送信者となり、もう 1 つが受信者となるスキームのトラフィックを交換します。トポロジの左半分のすべてのホストを相互接続する左側のルーターと、右半分のすべてのホストを相互接続する右側のルーターがあります。すべてのフローは、2 つのルーター間の共通の中央リンクを共有します。
テスト
分析
プロットと統計の生成
インストール
スキームのトラブルシューティング
新しいスキームの追加
Python のサポート
サードパーティのライブラリ
著者名
接触
このコマンドは、テストするスキームを含むコレクションへのパスを指定し、中央リンクのレートが 120 Mbps、可変遅延 (ベース遅延 20 ミリ秒、デルタ 500 ミリ秒、ステップ 10 ミリ秒、ジッター 5) でテストを 30 秒間実行します。 MS):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
これがスクリプトの最初の実行である場合、以下に示すデフォルトのレイアウト ファイルlayout.yml
が生成され、使用されます。結果として得られるテスト設定は、このページの上部にあるダンベル トポロジの図に示されています。レイアウト ファイルを編集して、さまざまなスキームに属し、多様なネットワーク設定を持つより多くのフローを使用して、より複雑なテスト設定を行うことができます。
# Delays/rates are optional: if lacking or null, they are set to 0us/0.0
# and for netem, to set delay/rate to zero is same as to leave it unset.
# Sizes of queues are optional: if lacking or null, they are set to 1000.
- direction : <-
flows : 1
left-delay : null
left-queues : null
left-rate : null
right-delay : null
right-queues : null
right-rate : null
scheme : cubic
start : 0
- direction : ->
flows : 2
left-delay : 0us
left-queues : 2000
left-rate : 120.0
right-delay : 5ms
right-queues : 3000
right-rate : 120
scheme : vegas
start : 15
- direction : ->
flows : 1
scheme : cubic
start : 0
レート、遅延、およびキュー サイズは、 tc
qdisc NetEm リンク エミュレータを使用して、トポロジ内の各リンクの終端にある両方のインターフェイスに常にインストールされます。特に、これは、リンクの RTT が (片方向) 遅延の 2 倍であることを意味します。中央リンクのみ、その端のインターフェイスの 2 つの異なるキュー サイズを持つことができます。スクリプトのヘルプ メッセージの-q1
、 -q2
、 -q
引数を参照してください。デフォルトでは、両方のキューのパケット数は 1000 です。
中央リンクでの可変遅延は、ベース遅延、デルタ、ステップ、およびジッターの 4 つの位置引数によって定義され、ジッターはスキップできます。デルタ時間ごとに、遅延は疑似乱数発生器に応じて段階的に増加または減少します。そのシードは-s
引数で指定できるか、現在の UNIX 時間が割り当てられます。中央リンクで一定の遅延を発生させるには、デルタ >= ランタイム-t
を選択します。
選択した出力ディレクトリに、ジェネレーター シードを含むテストのすべてのパラメーターを含むmetadata.json
ファイルが書き込まれます。このファイルは将来、テストを完全に再現するために CoCo-Beholder に提供される可能性があります。また、テスト中に、 tcpdump
使用して、ダンベル トポロジのすべてのホストで出力ディレクトリに PCAP ダンプ ファイルが記録されます。したがって、図の例では、8 つの PCAP ダンプ ファイルが記録されました。
注 #1:すべてのリンク (サイドおよび中央 (ジッターはカウントされない)) の最大遅延は、 -m
オプションで指定できます。中央リンクで方形波遅延を持たせるには、最大遅延を基本遅延とステップの合計に設定します。
注 #2:テスト スクリプトは、スキームのフローを起動する前に、レイアウト ファイル内の各スキームの Pantheon ラッパーでsetup_after_reboot
を呼び出すため、ユーザーは再起動のたびにスキームを手動で設定する必要がありません。
分析スクリプトは、入力フォルダーと出力フォルダー (デフォルトではdumps
とgraphs/data
の 2 つの引数のみを受け入れます。
まず、スクリプトはメタデータ ファイルを入力フォルダーから出力フォルダーにコピーするだけです。次に、スクリプトは各フローの PCAP ダンプのペア<flow's starting #>-<scheme>-<sender/receiver>.pcap
を処理し、フローのパケットに関する情報をフローの個別の json データ ログ ファイルに抽出します。たとえば、~12 GB のダンプが 2 つある場合、~300 MB のデータ ログ ファイルが 1 つ生成されます。
図面の例の分析スクリプトの部分的な出力:
./analyze.py
cubic scheme, flow 1:
sender dump: 100.0% in 5.18s
Total: 222667 pkts/224631734 bytes, from sender: 144906 pkts/219351284 bytes
receiver dump: 100.0% in 5.37s
Total: 222245 pkts/223376026 bytes, from sender: 144052 pkts/218058328 bytes
♥ Union of data from sender recorded on both sides: 144906 pkts/219351284 bytes
♦ Subset of ♥ which was not recorded at sender : 0 pkts/0 bytes
♣ Subset of ♥ which was not recorded at receiver : 854 pkts/1292956 bytes
♠ Loss (ratio of ♣ bytes to ♥ bytes) : 0.589%
Saving the data of the flow to the file...
==========================================
# and so on for the three more flows...
今後のプロットや統計生成では、PCAP ダンプは必要なくなりました。 PCAP ダンプの分析は 1 回だけ実行され、その後、データ ログ ファイルに対してプロット スクリプトを必要なだけ何度でも実行して、さまざまなプロットを迅速に作成できます。
プロット スクリプトplot.py
フローのデータ ログ ファイルを読み取り、出力フォルダーにプロットと統計情報を生成します (デフォルトではgraphs
)。さまざまなタイプのプロットと統計を生成できます。
-f, --per-flow Graphs and stats are generated per flow, i.e. each
graph has a separate curve per flow
-t, --total Total graphs and stats are generated for all flows
altogether, i.e. each graph has only one curve
-s "FIELD1 FIELD2...", --per-subset "FIELD1 FIELD2..."
Graphs and stats are generated per subset, i.e. each
graph has one curve per subset. Flows are in one
subset if they have the same values of the chosen
layout field(s). E.g. for -s "scheme direction", each
graph will have one curve per subset of flows having
both the same scheme name and direction. Currently
allowed layout fields: ['scheme', 'direction'].
選択したタイプに対して、3 つの折れ線グラフと 1 つの散布図が生成されます。
たとえば、上では、図面内のセットアップのフローごと、パケットごとの一方向遅延プロットを確認できます。
平均プロットは、集計時間間隔 ( -i
引数で指定された任意の正の浮動小数点数、またはデフォルトでは 0.5 秒) ごとに平均化されます。
平均ジャイナ教指数プロットには、対応する平均スループット プロットに存在する曲線上で計算された 1 つの曲線が常に含まれています。
引数-c
および-j
使用すると、プロット内の曲線の色を柔軟に変更できます。
選択したタイプについて、統計ファイルが生成されます。選択した集計間隔には依存せず、次の内容が含まれます。
曲線の全体の平均一方向遅延と全体のパケットごとの平均一方向遅延は、異なる方法で計算された同じ値です。
インストールプロセスは次のとおりです。
Pantheon の輻輳制御スキームのコレクションをインストールし、必要に応じてコレクションにスキームをローカルに追加します。
インストール スクリプトを使用して CoCo-Beholder エミュレータをインストールします
終わり。 CoCo-Beholder を使用してコレクション内のスキームをテストします。
CoCo-Beholder 自体のインストールは簡単で、そのインストール スクリプトinstall.sh
非常に簡単で短いです。ただし、Pantheon のスキーム コレクションをインストールすると、多くの問題が発生することがよくあります。さらに、一部の Linux ディストリビューションにはバグがあります。したがって、Ubuntu 16.04、Ubuntu 18.04、および Debian 10 へのインストールの詳細な手順を参照してください。
以下の手順は、Ubuntu 16.04.6-desktop-amd64 (2019 年 11 月) を新規インストールした VM でテストされました。
一般的な注意事項: bbr (TCP BBRv1.0) スキームが必要な場合は、必ず Linux カーネル 4.9 以上を使用してください。
16.04 LTS (16.04.5 以降) の新規リリースには、Linux カーネル 4.15 が付属しています。 CoCo-Beholder は、Ubuntu カーネル 4.15 で壊れるtc qdisc NetEm 遅延ジッターを使用します。解決策:
sudo apt-get install linux-image-4.13.0-39-generic linux-headers-4.13.0-39
linux-headers-4.13.0-39-generic linux-image-extra-4.13.0-39-generic
ファイル/etc/default/grub
で、行GRUB_HIDDEN_TIMEOUT=0
コメント アウトし、コマンドsudo update-grub
を実行します。これにより、再起動後に Grub メニューが表示されるようになります。
再起動し、Grub メニューでAdvanced options for Ubuntu
を選択すると、 Ubuntu, with Linux 4.13.0-39-generic
表示されます。コマンドuname -ar
を使用して、実行中のカーネルを確認します。
Pantheon git リポジトリと、含まれているスキームの git サブモジュールをダウンロードします。
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
スクリプトを使用) をスキップできます。以下のコマンドを使用してスキームのみをインストールする必要があります。最後のコマンドでCommand "python setup.py egg_info" failed with error code 1...
のようなエラーが表示された場合は、 sudo pip install --upgrade pip
を実行して、失敗したコマンドを繰り返します。 sudo apt-get install autoconf # for verus
sudo apt-get install nodejs-legacy # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
これで、スキームをテストする準備が整いました。
以下の手順は、Ubuntu 18.04.3-desktop-amd64 (2019 年 11 月) を新規インストールした VM でテストされました。
一般的な注意事項: bbr (TCP BBRv1.0) スキームが必要な場合は、必ず Linux カーネル 4.9 以上を使用してください。
Ubuntu カーネル 4.15 にはバグがあります。 Ubuntu >=18.04.3 では、カーネル >=5.0 が入手できるため、次のステップに進んでください。
Pantheon git リポジトリと、含まれているスキームの git サブモジュールをダウンロードします。
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
スクリプトを使用) をスキップできます。以下のコマンドを使用してスキームのみをインストールする必要があります。 sudo apt-get install autoconf # for verus
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
これで、スキームをテストする準備が整いました。
以下の手順は、Debian 10.1.0-amd64-netinst (2019 年 11 月) を新規インストールした VM でテストされました。
一般的な注意事項: bbr (TCP BBRv1.0) スキームが必要な場合は、必ず Linux カーネル 4.9 以上を使用してください。
Ubuntu カーネル 4.15 にはバグがあります。 Debian カーネル 4.15 にこの問題があるかどうかは不明です。とにかく、Debian >=10.1.0 では、カーネル >=4.19 が得られるので、次のステップに進んでください。
Pantheon git リポジトリと、含まれているスキームの git サブモジュールをダウンロードします。
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
スクリプトを使用) をスキップできます。スキームのみをインストールする必要があります。まず、スキームの依存関係をインストールします。 sed -i ' s/chromium-browser/chromium/g ' src/wrappers/webrtc.py # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
文字列export PATH=/usr/sbin:$PATH
~/.bashrc
ファイルに追加し、コマンドsource ~/.bashrc
を実行します。これにより、 /usr/sbin/sysctl
ユーティリティが有効になります。これは、インストール中だけでなく、その後も必要になります。
Verus をビルドするには、alglib ライブラリをダウングレードする必要があります。したがって、 deb <URL> stretch main
行を/etc/apt/sources.list
に追加して実行してください。
sudo apt-get update
sudo apt-get remove libalglib-dev # remove 3.14 version
sudo apt-get install -t stretch libalglib-dev # install 3.10 version
sudo apt-get install autoconf # for verus
myregex= ' s/milliseconds((.+))/milliseconds(int(1))/g '
sed -i $myregex third_party/verus/src/verus_client.cpp
sed -i $myregex third_party/verus/src/verus_server.cpp
sudo apt-get install pkg-config # for sprout
sudo apt-get install libtinfo5 # for quic
# During the setup, do not be afraid of CERTIFICATE_VERIFY_FAILED errors by quic
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
# matplotlib will give Python backports.functools_lru_cache error. To solve:
sudo pip install arrow==0.12.0
これで、スキームをテストする準備が整いました。
cd pantheon
src/wrappers/vegas.py setup_after_reboot # setup the scheme once after reboot
src/wrappers/vegas.py run_first # who is server: sender or receiver
# receiver
src/wrappers/vegas.py receiver 54321 # start server in one shell
src/wrappers/vegas.py sender 127.0.0.1 54321 # start client in another shell
sudo pkill -9 -f vegas # kill all the started processes
cd coco-beholder
myregex= ' s/((.+)).pid/(1, stdout=None, stderr=None).pid/g '
sed -i " $myregex " variable_delay/src/test/test.py
Pantheon コレクションに存在しないスキームをテストしたい場合は、次のようにローカルに追加できます。
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
エントリをpantheon/src/config.yml
ファイルに追加します。 CoCo-Beholder はそれらを読み取れないため、色、名前、マーカーは任意です。 cdg :
name : TCP CDG
color : red
marker : ' x '
cp pantheon/src/wrappers/vegas.py pantheon/src/wrappers/cdg.py
sed -i 's/vegas/cdg/g' pantheon/src/wrappers/cdg.py
これで、レイアウト ファイルで cdg フローを指定することで、通常どおり CoCo-Beholder で cdg をテストできるようになります。
CoCo-Beholder は、Python 2.7、3.5、3.6、および 3.7 で動作することが保証されています。 CoCo-Beholder のインストール スクリプトinstall.sh
デフォルトで Python 2 ライブラリの依存関係をインストールします。 Python 3 の場合は、インストール スクリプト内の対応する行をコメント アウトしてください。
CoCo-Beholder は、Mininet ライブラリを利用します。この API を使用すると、別のネットワーク名前空間で UNIX シェルとして仮想ホストを作成し、仮想ホストのペア間に veth ペア リンクを作成し、仮想ホストでプロセスを起動できます。 CoCo-Beholder は、コントローラー、スイッチ、トポロジー、TCLink、または Mininet のその他の上位エンティティを使用しません。将来の互換性の問題を防止し、CoCo-Beholder のインストールを容易にするために、Mininet 2.3.0d5 の必要な部分は Mininet ライセンスに従ってサードパーティ ライブラリとして CoCo-Beholder リポジトリに含まれています。
エフゲニヤ・カシナ氏は、マックス・プランク氏のインターネット・アーキテクチャ学科のアンジャ・フェルドマン教授とコリンナ・クーペット博士の監督の下、2019年にザールランド大学で修士論文「CoCo-Beholder: Enabling Comprehensive Evaval of Congestion Control Algorithms」の範囲内でプログラムを実装した。情報学研究所。
プログラムに関するご質問がございましたら、Evgeniya Khasina まで電子メール アドレスまでご連絡ください。