Mercurial > hg > Papers > 2009 > linda-sigos
view presentation/federated-linda.ind @ 14:35f802ff2842 default tip
fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 24 Apr 2009 17:41:24 +0900 |
parents | 074443128a27 |
children |
line wrap: on
line source
-title: 連邦型Lindaによる分散アルゴリズムをデバッグするためのメタプロトコル --author: 赤嶺悠太, 小野雅俊, 河野真治 --分散アルゴリズムを勉強する Socketからプログラムするのは敷居が高すぎる でも実際に動かしてみないと体験出来ない。 通信のモデルがある方が良い Linda って、モデルはわかりやすいよね〜 しかし、Linda の共有されたタプル空間ではScale しようがない --Scaleする分散プログラム Scalabilty とは? 接続するサーバ、ネットワーク規模が増える 増えても、サービスの性質を一定に保つ --分散プログラムの三つの要素 Local Accesss 末端の通信 Protocol Engine 通信するサーバ Configuration サーバの接続パターン --プロトコルエンジンとタプル空間 タプル空間を相互に、プロトコルエンジンが接続すると言うのを考える タプル空間一つにアクセスが集中しない DHTとかとは正反対 Scale する適切なプロトコルを提供して、それを使用して分散アルゴリズムを作る --Single Thread Implementation 一つのLinda Server はSingle Threaded 二つのLinda Serverを接続するPrototocol Engine はSingle Threaded in/out では待ち合わせを行なわない polling ( callback ) base でプログラムする --The Reason why Single Thread Implementation 実装しやすい デバッグしやすい APIがゲーム向き (主ターゲットがネットワークゲーム) --API public PSXLinda open(String _host,int _port) public PSXReply in(int id) タプルスペース番号より引数で指定したidのタプルの受け取りを要求する。 public PSXReply out(int id, ByteBuffer data) 引数で指定したidでByteBuffer内のデータを送信する。 public int sync(long mtimeout) 接続しているLinda Serverとタプルの送受信のポーリングを行う。 \end{itemize} --プログラミング例 FederatedLinda fdl; PSXLinda getpsx; PSXLinda sendpsx; PSXReply in; ByteBuffer data = ByteBuffer.allocate(10); //通信を初期化する fdl = FederatedLinda.init(); //データを取ってくるホストと受け渡すホストとの接続開始 getpsx = fdl.open("cs100",10000); sendpsx = fdl.open("cs101",10001); //取ってくるホストからinを指定してデータを取得 in = getpsx.in(10) data = in.getData(); //受け渡すホストに対しデータとidを指定して同期 sendpsx.out(10,data); fdl.sync(); --例えば、 これを使って、Compact Routing を実装してみる Compact Routing でも Mesh などでは、収束しない 細かい実装をしないとScaleしない。(Split horizen, Hop count) プログラムミスなのか、アルゴリズムが悪いのか? Scale するように調整するには? --デバッグするには? サーバの数だけ画面を開く.... だめです。 デバッグを実装する必要がある。 --デバッガに対する要求 タプル空間に直接アクセス出来る デバッグ自体がScale して欲しい デバッグ通信自体が、Federated Linda であるべき デバッグ通信のデバッグ対象への影響が少ない local なサーバの状態だけでなく大域的な通信状態を取り扱える --メタエンジン Linda Server に、タプル空間をいじれるメタエンジンを付加する メタエンジン上に、Fedrated Linda を使ってデバッグプロトコルを実装する --メタエンジンの実装 Linda Sever/Protocol Engine はSingle Thread なので、変わりばんこに実行してやれば良い。 最初にFederated Linda 上で通常のプログラムとしてデバッグプロトコルを作成する それを、メタエンジンでの通信に移す --Linda ServerとMeta Engine Linda ServerとProtocol Engineは、1対1が自然なようである Meta Engine とProtocol Engine の違いは、タプル空間に直接さわれるかどうか なので、今後は、1対1を仮定して良いと思われる --分散プログラムのデバッグ手法 対象とするバグ Protocol Engine の実装ミス 入出力が正しくない 大域的な分散アルゴリズム自体のミス Dead Lock/Live Lock Scale しないバグ 輻輳、飢餓 --デバッグプロトコル 大域状態を調べる 計算を止める 計算を再開する デッドロック/ライブロックを検出する 条件に従って入出力するタプルの通信パターンを記憶する --デバッグ用の通信パターン もっとも干渉が少ない場合として、単一のデバッグコマンドを全サーバに周回させるプロトコルを考える。 --実験 Linda Server間でMeta Engineがデータをやり取りする場合 <center><img src="fig/meta_ring_three.jpg"></center> 3〜100までの台数でデータが1周(図\ref{metaring})する時間、 および1000周(図\ref{metaring1000})した時に掛かった時間を測定する。 前者では接続の手間を含む通信時間、後者では通信のみの時間を 計ることが出来る。 実験は、 琉球大学 情報工学科のクラスタ上(Core Duo 2GHz,メモリ1GB) Torque AlaxalA Gigabit Ethernet Switch クラスタ自体は180台あるが、安定して動作する100台までを使用 <center><img src="fig/metaring1.jpg"></center> データを1周のみした場合は1サイクルあたり約14000ms、一台あたり約140ms これは、TCPの接続時間がかなり大ききことを示している。 デバッガとしては容認できないと思われる。 従って、毎回、新しく接続するようなHTMLのような 通信を採用することはできないことがわかる。 --千周の平均周回時間 <center><img src="fig/metaring1.jpg"></center> 1サイクルおよそ60ms、一台につき約0.6msとなっている。 パケット1KBから100KBまでの差は2倍程度であり、それ以上はパケットサイズに リニアに時間がかかる。従って、数十KB程度以下にデータを抑えることは、 応答時間的には意味がない。 --まとめ Linda 複数接続するFederated Linda Server をJava 上に実装し、 Metaで通信するMeta Protocol Engineを実装し評価した。 今後は、Meta Protocol Engineにデバッグプロトコルを実装していく