Transcript Document

広域並列分散プログラミングのための
高性能デッドロックフリーオーバーレイ
田浦研究室
076426 弘中健
広域環境における並列分散計算
• 複数のクラスタで並列計算に使う機会が増加
– WANのバンド幅増加
– 複数のクラスタをWANで接続した環境が普及
• Grid5000(フランス), DAS-3(オランダ), InTrigger(日本)
• 並列分散計算の増加
– 並列ライブラリを用いたアプリ
• 組み合わせ最適化問題
• モデルチェッキング
WAN
– データインテンシブなアプリ
• 大量のデータ解析を並列化
Cluster
2009/2/10
2
広域環境上の並列分散アプリ用
NAT/firewall
通信基盤の要件
• WANの接続性の解決
– NAT, Firewall
• スケーラビリティ
Too many…
– 接続数を減らす
• 通信性能の向上
– WAN/LAN上の
コンテンションを防ぐ
Contention!
オーバレイが有効な手法である
2009/2/10
3
広域環境上オーバレイ
• アプリ・レベルで独自のネットワークを構築
– UDP/TCPを用いる
通信は転送
• エンドホストも通信を転送
– 直接繋がっていなくても
通信を実現
Cluster
firewall
Cluster
2009/2/10
4
本研究の貢献
• 広域並列分散計算の通信を効率的に行うオーバレイ
– 低オーバーヘッドな転送
– メモリオーバフロー・デッドロックを起こさない
– 不均一な実ネットワークに自律的に対応するルーティング
• 大規模なWAN環境で実装・実証した
– 4~7クラスタ:最大291ノード
– 集合通信でオーバレイなしより高性能
• 分散オブジェクト指向プログラミングライブラリ
– 本発表では省略させて頂きます
– 目標:提案するオーバレイを通信基盤とした
広域環境における効率的な並列・分散プログラミング環境を提供
2009/2/10
5
提案オーバレイの応用
• 並列・分散計算ライブラリ
– MPI, 分散共有メモリ
• 並列・分散プログラミング言語/フレームワーク
– 分散オブジェクト (JavaRMI), ワークフロー(MapReduce, 分散Make)
• 分散システムの通信基盤
– 分散ファイルシステム
– P2Pシステム (DHT, ファイル転送)
Parallel and Distributed Applications
Programming Languages, Libraries,
Frameworks, Middle-wares
Application-level Overlay
2009/2/10
LAN/WAN, NAT, firewall, scalability…
6
問題説明
•
•
•
•
•
•
序論
問題説明
関連研究
提案手法
実験・評価
まとめ
2009/2/10
7
広域オーバレイ上の通信の問題
• 広域環境では遅延・バンド幅が不均一
– 100[us] ~ 100[ms]
– 10 [Mbps] ~ 10[Gbps]
• 単純な転送手法では不均一性による問題が発生する
– 中継ノードのメモリオーバフロー
– 通信のデッドロック
10 [Gbps]
10 [Mbps]
10 [Gbps]
Narrow
Link
2009/2/10
8
問題1:メモリオーバフロー
• 中継ノードがバッファのメモリ容量を考えずに
パケットを受信するとメモリオーバフローをお
こす
– 中継ノードは有限バッファが必要
src
2009/2/10
1Gbps
1Gbps
dst
WAN Link
9
問題2:通信のデッドロック
• パイプライン転送
– 各ノードは有限バッファが一杯になったら受信を
やめる
• 転送が待たされ、中継ノードを用いてフロー制御
• 通信がデッドロックしてしまう
packet
buffer
FULL!
src
dst
フロー制御
2009/2/10
10
通信デッドロックの例
• 複数の転送が混在する場合:
– 次に使いたいリンクが別の転送
に占有され、転送が待たされる
Link: A
Link: D
Link: B
Link: C
• 例:4つの転送
–
–
–
–
Link A → Link B
Link B → Link C
Link C → Link D
Link D → Link A
• 転送は互いに待ち合う
⇒デッドロック
2009/2/10
11
通信デッドロックの本質
• リンク間の依存関係に
サイクルが発生
Link: A
Link: D
• デッドロックフリールーティング
が必要
– リンク間の依存関係に
サイクルが起きないように
使える経路に制約を課す
2009/2/10
Link: B
Link: C
12
問題3:局所性を考慮したルーティング
• 既存のデッドロックフリールーティング手法は
実ネットワークの考慮をしない
– バンド幅・遅延のロスが大きくなってしまう
– 広域環境のネットワーク情報を考慮した
ルーティングが必要
2009/2/10
13
関連研究
•
•
•
•
•
•
序論
問題説明
関連研究
提案手法
実験・評価
まとめ
2009/2/10
14
既存の広域オーバレイ
• 転送時のメモリ、デッドロックを考慮した実装は少ない
• RON (Resilient Overlay Network) [Andersen et al. ‘01]
– 全体全でつなぐUDPオーバレイ
– UDPインターフェイスを提供
• そもそも通信の信頼性はなく、ユーザ任せ
• DiskRouter [Kola et al. ‘03]
– ファイル転送用のオーバレイ
– バッファの使用率が閾値を超えると受信中断
• デッドロックの恐れがある
2009/2/10
15
フロー制御を実装する手法
• UDPオーバレイ
+
src
dst
End-Endのみでフロー制御
feedback
• [Kar et al. ’01]
– 各パケットにACK
– ACKは経路上リンクの使用状況をpiggyback
UDP
UDP
UDP
• Spines : [Amir et al. ‘02]
– 全リンクの混雑情報を定期的に交換
– 経路上リンクの使用状況を考慮して送信レートを調節
• 利点:
– 中継ノードの問題を解消
• 欠点:
– オーバーヘッドが大きい:ユーザで「TCPの再実装」
– パラメータチューニングが困難:1 Gigabit Ether でも約300[Mbps]
本研究: TCPを使い、中継ノードを用いたフロー制御
+ デッドロックを防ぐ手法
2009/2/10
16
デッドロックフリールーティング
• 通信にデッドロックが起きないように使える経路に制約をかす
– 広域オーバレイに良く適用したものはない
• 並列コンピュータのインターコネクト
– 特殊なトポロジーを想定
– [Antonio et al. ’94]
– [Dally et al. ’87, ‘93]
• 一般なグラフに適用可:
–
–
–
–
–
2009/2/10
実ネットワークは未考慮
実ネットワークにそぐわない経路の制約
Up/Down Routing [Schroeder et al. ‘91]
Ordered-link Routing [Chiu et al. ‘02]
L-Turn Routing [Koibuchi et al. ‘01]
17
提案手法
•
•
•
•
•
•
序論
問題説明
関連研究
提案手法
実験・評価
まとめ
2009/2/10
18
提案手法の概要
• 基本的な提案
– TCPでオーバレイを構築
– デッドロックフリーにする経路制約
– 経路を計算
• ネットワーク情報を用いた最適化
– 局所性を考慮したオーバレイの構築
– 局所性を考慮したデッドロックフリー制約
– 転送スループットを考慮した経路計算
2009/2/10
19
オーバレイの転送方法
• オーバレイのリンク:
– TCP接続を使うことでTCPのフロー制御を活用
• データの分割:
– 送信されるデータは一定のパケットに分割
• 信頼性のある通信を実現:
– srcからdstまでFIFOでパイプライン転送
– 中継ノードはパケットを落さない
• 転送方法:
– バッファに余裕がある限り受信、一杯になったら受信を中断
– 中継ノードを用いたフロー制御
– 直接繋いだTCPが実現するスループットを得る
packet
src
2009/2/10
TCP
buffer
TCP
FULL!
TCP
dst
20
デッドロックフリールーティング
Up/Down Routing
[Schroeder et al. ‘91]
DOWN
• ルートノードから幅優先探索
i
– 昇順にIDを振る
i>j
j
UP
• IDによってリンク方向を定義
– IDが小さいノードの方向
DOWN
0
• エッジのたどり方を定義
UP
– UP: リンク方向に沿う
– DOWN:リンク方向に逆らう
• 経路制約:
2
6
UP
5
UP
4
3
2009/2/10
UP
1
– DOWNからUPは禁止
実ネットワークと独立に決定
DOWN
DOWN
DOWN
DOWN
Down → Up
禁止
21
提案手法の概要
• 基本的な提案
– TCPでオーバレイを構築
– デッドロックフリーにする経路制約
– 経路を計算
• ネットワーク情報を用いた最適化
ノード間遅延、接続リンクバンド幅情報
– 局所性を考慮したオーバレイの構築
– 局所性を考慮したデッドロックフリー制約
– 転送スループットを考慮した経路計算
2009/2/10
22
局所性を考慮したオーバレイの構築
[Saito et al. ‘07]
• 「遠いノードへは回り道しても影響は少ない」
• 通信性能を維持する様に接続選択
– 遠いノードとは低い確率
– 近いノードとは高い確率
小さな
影響
大きな
影響
• 各ノードのアルゴリズム
– すべてのピアを低遅延順にソート
– [d^k, d^k+1 )の区間でd個のピアを選択し接続
– ノード数Nに対してNlogNの接続を確立する
低遅延
2009/2/10
d
d^2
d^3
23
Up/Downルーティングの改善
• 幅優先探索のID付け
0
– マルチクラスタ環境で問題
UP
• UP→DOWNする経路増えてしまう
• クラスタ内で小さいIDなノード
– UP方向リンクは高遅延WANリンク
– UP→DOWNの経路は
WAN経由になってしまう
DOWN
1
3
2
5
4
cluster
2009/2/10
24
提案Up/Downルーティング
0
• 深さ優先探索のID付け
– 低遅延のピアを優先的に探索
1
• Rationale
DOWN
3
4
UP
– UP→DOWNの経路を減らす
– クラスタ内の経路はすべて
UP or DOWNで辿れるようにする
5
2009/2/10
25
デッドロックフリー制約の比較
• クラスタ内の経路を禁止する制約を削減
0
0
UP
DOWN
1
3
1
2
DOWN
5
4
BFS-updown
DOWN
4
3
cluster
2009/2/10
2
5
Locality-aware
DFS-updown
cluster
26
ルーティングメトリック
• 経路のスループットに重点
– 経路上のリンクバンド幅逆数の和
B1
src
2009/2/10
B2
B3
dst
27
各ノードの転送手続き(1/2)
• 各TCP接続に以下を定義
– 有限な送信バッファ
– 1 packetの受信バッファ
• 転送の手続き
– 受信バッファに1packetに受信
– 送信バッファに移す
– 送信バッファが一杯だと
それ以上受信しない
Send buffer
FULL!
Recv buffer
2009/2/10
28
各ノードの転送手続き(2/2)
• 複数の転送が混雑した同じリンクに競合
– 交互にpacketを転送する
• デッドロックフリールーティング
– デッドロックが生じることはない
2009/2/10
29
実験・評価
•
•
•
•
•
•
序論
問題説明
関連研究
提案手法
実験・評価
まとめ
2009/2/10
30
Deadlock-freeルーティング
のオーバーヘッド
• Deadlock無考慮の場合とオーバーヘッドを検証
– ordered-link
– Up/Down
– 提案Up/Down
• シミュレーション
– 13実クラスタ (515ノード)
– オーバレイ接続密度を変化
• 全経路のホップ数
• 全経路のバンド幅
2009/2/10
31
全経路のホップ数
Average Hops
Deadlock無考慮
と差がない
2009/2/10
Max. Hops
Deadlock無考慮
と差がない
• 平均ホップ数はほとんど差がない
• 最長ホップ数でも、提案Up/Downは同等な経路長
32
経路バンド幅の最低比率
疎なオーバレイ
でも高バンド幅
• 他のdeadlock-free手法は無駄なWAN経路がある
• 提案手法ではWAN経路を避けるので本来のバンド幅が得られる
2009/2/10
33
Deadlock-free制約
の通信遅延への影響
• 実環境:7クラスタ
(170ノード)
• 全経路の遅延を測定
– 直接通信と比較
– 接続密度: 9%
• Deadlock-free制約の検証
– メトリックは遅延
2009/2/10
34
直接 vs. オーバレイ遅延分布
Up/Down
はLAN内ペアもWAN経由
提案Up/Down
は直接通信と同等
• Up/Downは制約のためクラスタ内通信もWANを経由している
2009/2/10
35
転送スループットの評価
• 幅広い環境で高スループット出ることを検証
– 1 Gigabit Ethernet LAN (940 [Mbps])
– Myrinet 10G LAN (7 [Gbps])
• メッセージサイズを変化
2009/2/10
36
転送スループットの評価
GbEクラスタ (940[Mbps])
2009/2/10
Myrinetクラスタ (7[Gbps])
• 数ホップ転送しても直接TCPソケットに近い性能
• Myrinetに関しては4.5[Gbps]しか得られなかった
37
集合通信性能の検証
• 提案オーバレイを用いて集合通信
– デッドロックフリー制約でも高性能
• 集合通信
– Gather, All-to-All
– メッセージサイズ・接続密度を変化させて評価
• 環境
– LAN: 1-switch (36 nodes), 階層的 (177 nodes)
– WAN: 4 clusters (291 nodes)
2009/2/10
38
集合通信:Gather時間
• switchで衝突:
1-switch クラスタ (36 ノード)
• Packet-loss
• TCP再送:
• 200 [ms] loss
• 疎なオーバレイ:
• 衝突を緩和
TCP RTO: 200 [ms]
による時間の開き
ポート
で衝突
2009/2/10
39
集合通信:Gather性能比較
衝突回避に
よる効果
2009/2/10
4 クラスタ (291 ノード)
40
集合通信:All-to-All
• 大規模な環境
4Gbps
– ボトルネックがある
– 階層的なクラスタ
• 177ノード
• MPICH (直接通信)と比較
4Gbps
1Gbps
– WANで接続された4クラスタ
• 291ノード
Cluster
1Gbps
1Gbps
Cluster
2009/2/10
Cluster
1Gbps
1Gbps
1Gbps
Cluster
41
集合通信:All-to-All性能比較
1 クラスタ (177 ノード)
4 クラスタ (291 ノード)
• 階層的な大きなクラスタではスイッチでのパケットロスが多くなる
• マルチクラスタ環境はWANのパケットロスが主要項になる
2009/2/10
42
まとめ
•
•
•
•
•
•
序論
問題説明
関連研究
提案手法
実験・評価
まとめ
2009/2/10
43
まとめ
• 広域並列分散計算用オーバレイを提案
– 不均一な広域環境での転送問題を解決
• メモリアウト・デッドロックを起こさない
– 実ネットワークを考慮した
低オーバヘッドルーティング
• 大規模なWAN環境で実装・実証した
– 集合通信ではLAN/WAN共により高性能
2009/2/10
44
今後の課題
• 別途提案した分散プログラミングライブラリ
の通信基盤として応用
– 分散オブジェクト指向
– ノードの動的な参加・脱退に対応
– 広域環境での並列分散プログラミングを簡潔に
• 課題:
– 転送・ルーティングを動的変化に対応させる
2009/2/10
45
発表文献
•
投稿中(1件)
– High Performance Wide-area Overlay using Deadlock-free Routing. High Performance
Distributed Computing(HPDC), 2009
•
論文誌 (2件)
– 複雑なグリッド環境で柔軟なプログラミングを実現するフレームワーク.情報処理学会論文
誌:コンピューティングシステム.Vol.1 No.2 (ACS 23), pp.157-168, 2008年8月.
– A Low-stretch Object Migration Scheme for Wide-area Environments. IPSJ Transactions on
Programming. Vol.48 No.SIG 12 (PRO 34), pp.28-40, August 2007.
•
査読付学会(2件)
– gluepy : A Simple Distributed Python Framework for Complex Grid Environments. At 21st
Annual International Workshop on Languages and Compilers for Parallel Computing
(LCPC2008). LNCS Vol.5335, pp.249-263, July 2008.
– 複雑なグリッド環境で柔軟なプログラミングを実現するフレームワーク.先端的計算基盤シン
ポジウム (SACSIS 2008),pp.349-358,筑波,2008年5月.
•
研究会(2件)
– 広域TCPオーバレイにおけるデッドロックフリールーティング. 情報処理学会研究報告OS-109
(SWoPP 2008),pp.9-15,佐賀,2008年8月.
– 揮発性資源上での並列分散計算を支援するオブジェクト指向ライブラリ. 情報処理学会研究
報告OS-106 (SWoPP 2007),pp.71-78,旭川,2007年8月.
•
その他査読なし学会(4件), ポスタ(3件)
2009/2/10
46
2009/2/10
47
2009/2/10
48
提案 : gluepy
• Grid環境用分散オブジェクト指向Pythonプログラミングライブラリ
–
–
–
–
並列分散計算に必要なノード間通信・協調の記述を容易にする
各計算ノードを”glue”で繋ぎ合わせる目的のライブラリ
WANの接続性の問題を隠ぺい
動的にノードが参加・脱退する環境でも汎用言語の拡張で記述できる
• プログラミングモデル:
– 分散計算・通信には分散オブジェクトへのRMI
(Remote Method Invocation)
• メソッド呼び出しという抽象化
– 動的な計算環境での記述を支援
• ノード参加記述の支援
• ノード脱退のセマンティクス
•
処理系:
•
•
2009/2/10
ピア間で自動的に接続のオーバレイ構築
接続性 (NAT/firewall)の自動的解決
49
分散環境でオブジェクト指向
• 計算の分散
– メソッド呼び出し
– RMI (Remote Method
Invocation)
– 非同期RMIで並列計算
Proc: A
Proc: B
a.f()
a
RMI
Proc: A
• アプリの記述は自由
async.
RMI
2009/2/10
a.f()
a.f()
a.f()
f()
Proc: B
Proc: B
Proc: B
a
a
a
f()
f()
f()
50
動的な資源への対応
• 参加するプロセス対応
Objects in
computation
lookup
– 「最初の参照」 問題
Object lookup
– 参加ノードが既にある
objectへの参照を得るこ
とが出来る
• 故障⇒ RMI 例外
New object on
joining node
Exception!
– ユーザは例外処理で
rollbackなどを実装する
ことが出来る
Object on
failed node
2009/2/10
51
自動的オーバレイ構築(1)
• 接続性解決
Global IP
NAT
– 自動的にオーバレイ構築
Firewall
• TCPオーバレイ
– 起動時に自動的にピア情
報を取得
Attempt
connection
– 各ピアは少数のピアと接
続を確立
– 連結グラフを構築
established
connections
2009/2/10
52
自動的オーバレイ構築(2)
• Firewallクラスタ
– 自動port-forwarding
– SSH情報を入力・設定
Firewall
traversal
SSH
#config file
use src_pat dst_pat, prot=ssh, user=kenny
• 透過的通信
– P-P通信はルーティング
• 動的:AODV [Perkins ‘97]
P-to-P
communication
2009/2/10
53
Programming in gluepy
inherit Remote Object
• RemoteObject
– Base classを継承
– メソッドをRMIに出来る
class Peer(RemoteObject):
def run(self, arg):
# work here…
return result
async. RMI
run() on all
• futureを使った非同期RMI
–
–
futures = []
for p in peers:
明示的にスレッドは使わない
f = p.run.future(arg)
placeholder
wait for all futures.append(f)
• いずれ結果が格納される
results
– 逐次のflowを保ちやすい
waitall(futures)
for f in futures:
print f.get()
read for all
results
2009/2/10
54
SerialObjectの所有権
waiting threads
•
SerialObjects
– 排他制御があるオブジェクト
– RemoteObjectのsub-class
•
•
Th Th Th
各オブジェクトに所有権
•
object
Th Th
所有者スレッド
所有者はブロックすると所有権を放
棄する
– e.g: waitall(), 他Serial Objectへの同期
呼び出し
– 他のスレッドが取得可能
– 再帰呼び出しによるdeadlockを排除す
る
Th
2009/2/10
Th
Th
re-contest
for ownership
Th Th
unblock
owner
thread
Th
明示的なロックは不要
– call ⇒ acquire
– return ⇒ release
– メソッドの実行は1スレッドのみ
•
object
new
owner
thread
block
Give-up
Owner
ship
object
Th
55
SerialObjectにシグナルを送る
• 非同期イベントへの対応
object
– イベントを「シグナル」として表現し、扱う
SIGNAL
• Unix のシグナルセマンティクス
• Blocking操作がunblockする
Th
unblock
• オブジェクトへのシグナル
– オブジェクトcontextでblockしているス
レッドを1つ強制unblock
• もしくは、次にblockするスレッド
– Unblockされたスレッドでイベント処理が
可能
2009/2/10
object
handle
Th
56
SerialObjects in gluepy
• Atomic Section:
– メソッド内で
「ブロックする操作の間」
– 属性のstateを変える、
Non-SerialObjectへの呼び
出しなどがatomicに行える
• 例:分散Queue
– 空のqueueに対してpop()
はblockする
– add()で追加する
• 空でなくなったらsignal()
でunblockさせる
2009/2/10
class DistQueue(SerialObject):
def __init__(self):
Atomic
self.queue = []
Section
def add(self, x):
self.queue.append(x)
if len(self.queue) == 1:
self.signal()
Signal & wake
def pop(self):
while len(self.queue) == 0:
wait([])
Block until signal
x = self.queue.pop(0)
return x
57
例:Master-worker in gluepy (1/3)
• 参加・脱退に対応
• 動的な参加:
– 参加イベントを処理する
– block中にsignalで
Noneを返してunblock
class Master(SerialObject):
...
def nodeJoin(self , node):
self.nodes.append(node)
self.signal()
Signal for join
def run (self):
assigned = {}
while True:
while len(self.nodes)>0 and
len(self.jobs)>0:
ASYNC. RMIS TO IDLE WORKERS
readys = wait(futures)
if readys == None: continue
for f in readys:
HANDLE RESULTS
2009/2/10
Block &
Handle join
58
例: Master-worker in gluepy (2/3)
• 故障への処理
– 結果回収で例外
– 例外を処理し、再投入
for f in readys:
node, job = assigned.pop(f)
try:
print ”done:”, f.get()
self.nodes.append(node)
except RemoteException, e:
self.jobs.append(job)
Failure
handling
2009/2/10
59
例: Master-worker in gluepy (3/3)
• 起動
– マスタはオブジェクトを
公開
– ワーカは参照を得て
RMIで参加する
Master init
master = Master()
master.register(“master”)
Worker init
master.run()
worker = Worker()
master = RemoteRef(“master”)
master.nodeJoin(worker)
lookup on join
while True:
sleep(1)
2009/2/10
60
分散環境でオブジェクト指向
• ABCL [Yonezawa ‘90]
JavaRMI, Manta [Maassen
et al. ‘99]
ProActive [Huet et al. ‘04]
• 分散オブジェクト指向
Proc: A
Proc: B
a.f()
a
RMI
f()
– オブジェクトを資源間で分散
• 計算の分散
– メソッド呼び出し
– RMI (Remote Method
Invocation)
– 非同期RMIで並列計算
• アプリの記述は自由
2009/2/10
Proc: A
async.
RMI
a.f()
a.f()
a.f()
Proc: B
Proc: B
Proc: B
a
a
a
f()
f()
f()
61
Grid上分散オブジェクト指向の課題
• スレッドの競合
Proc:
A
Proc:
Proc:AA
Proc: B
a.f()
a.f()
a.f()
a
– 1つのオブジェクトに同時多
数RMI
– Active Objects
f()f()
f()
race
• 1 object = 1 thread
• デッドロックの懸念:
e.g.: 再帰呼び出し
• 参加処理の記述
– どのように参加するか
– 参加のイベント通知
Active
objects
• Event –drivenなループでは
flowが分断される
2009/2/10
b
f()
• 脱退への対応
– 透過的な解決は困難
a
b.f()
a.g()
deadlock
62
The Basic Programming Model
• 分散オブジェクト
– あるプロセスで生成
– RMIでアクセス
– Passive Objects
Proc: A
Proc: B
a.f()
a
• 占有スレッドはない
Spawn for
RMI
f()
• スレッド
– あくまで並列処理のため
– 同期・非同期RMIは
陰にスレッド生成
Proc
• Future
– 非同期RMIの返り値
– placeholder
– 呼出し中の例外も格納され
リレイズされる
2009/2/10
F = a.f() async
Spawn for
async
a
f()
store in F
63
2009/2/10
64
通信遅延の比率のCDF
2009/2/10
65
All-to-All:オーバレイ構築の比較
2009/2/10
66
2009/2/10
67
100 [Mbps]クラスタ間転送
2009/2/10
68
広域環境上オーバレイ
• 接続性の解決法
– 複数ホップで通信
• スケーラビリティ
– メモリ・stateful firewall
2009/2/10
Cluster
Application-level
Overlay
TCP/UDP
Link
firewall
Cluster
69
オーバレイ上の転送
• オーバレイ上の通信はノード間で転送される
• 転送のバンド幅が重要になる
buffer
src
2009/2/10
buffer
buffer
dst
70
安直な転送アルゴリズム
• 各ノードのアルゴリズム
• 受信:best effort
• 送信:best effort
• 均一な環境:高性能
• 不均一な環境:バッファがメモリーアウト
buffer
src
src
2009/2/10
1Gbps
1Gbps
buffer
1Gbps
1Gbps
1Gbps
dst
dst
WAN Link
71
パイプライン転送 (1/2)
• 複数のTCP接続でリレーする
– 受信:バッファに余裕があれば
– 送信:best effort
• 利点:
– 単純で低オーバヘッド
– TCPが実現するスループットを得る
– メモリ使用量は一定
FULL!
src
2009/2/10
FULL!
dst
72
パイプライン転送 (2/2)
• 欠点:通信デッドロック
– リンクAからリンクBに転送
– リンクBの転送がブロック
⇒リンクAの転送がブロック
FULL!
Link: A
FULL!
Link: B
– リンクAがリンクBを待つ
• 依存関係:リンクA→リンクB
2009/2/10
waits…
73
Dijsktra-likeな計算(1/3)
• 準備
(nid, R-1)
– R個のrankがあるとする
• Updownの時:R=2とする
– 各ノードをR個複製する
nid
(nid, 0)
• (node-id, rank-id)を識別子と
する
– 各無方向リンクを2つの有方
向リンクとする
• それぞれの有方向リンクに
rankを割り当てる
• Ordered-link
– 有方向リンクのペアに無方
向リンクのランクを割り当て
る
r
r
r
0
• Updown
– Up方向にランク: 0
– Down方向にランク:1
2009/2/10
1
74
Dijsktra-likeな計算(2/3)
• 制約
– (nid, r)のノードはランクr
以上のリンクのみ
(nid, r’)
たどれる
(nid, 0)
– (n0, r)がリンクr’を使って
n1に渡る時、
(n1, r’)に到達する
r'
(nid, r’)
• 初期条件
– ノードsrcからスタート
• (src, 0), … (src, R-1)までの
距離を0に初期化
2009/2/10
75
Dijsktra-likeな計算(3/3)
• 計算量
• Dijkstra: |E| + Vlog|V|
–
–
–
–
フィボナッチヒープを使うとdecrease-key: O(1)
レベル数:R
|E| = eR
|V| = nR
• eR + (nR) log(nR)
– 最悪(全対全):R = n
• 各ソースについて解くが分散計算が
容易に出来る
2009/2/10
76