非同期IOに基づくプログラミング・スタイルを使います

Download Report

Transcript 非同期IOに基づくプログラミング・スタイルを使います

Inside of Bamboo DHT

大阪市立大学大学院 創造都市研究科 藤田昭人

まずは自己紹介から・・・

• • • • 大阪市立大学大学院 創造都市研究科の学生です(D2) 本業はフリーランスのプログラマです(24年目) 専門はオペレーティング・システムです( UNIX カーネル屋) – – 仮想記憶 (VM) が好きです 仕事の関係で TCP/IP の拡張や分散システムの開発もやっていました P2P と関わるようになったのは永続アーカイブ キッカケでした (Persistent Archive) が – – – これは本来、図書館情報学でのテーマです 「インターネット上に流通する全てのデジタル・コンテンツを 数百年オーダーで長期保存する方法は・・・」といったお題です。 工学の人間にはほとんど笑い話に聞こえますが 真剣に悩んでいる人もいるらしい・・・ • 修士時代その筋の同期生に「今のコンピュータでは無理 !!

」と言い切られたのに カチンと来たので「じゃぁ、やってやろうじゃねぇか !!!!

」と大見得を切ってしまった のが事の始まりです。

今回の発表は?

• • • • 第3回DHT勉強会での私の発表の続編です。 – 別にシリーズ化を狙っているわけではない 前々回のあらすじ (http://homepage3.nifty.com/toremoro/study/fujita-DHT.pdf) – – – – – そもそも永続アーカイブを作るつもりだった そのストレージシステムとして OceanStore を検討したが挫折 その代わりのシステムとして Chord/Dhash の実装を当たるがドツボにはまる さらにその代わりのシステムとして i3 の実装にチャレンジするが・・・結局ダメダメ 「さあ、この後どうなるのでしょうか?」・・・というところで終了 前回のあらすじ (http://homepage3.nifty.com/toremoro/study/DHTkansai/DHTfujita.pdf) – – – 分散ハッシュテーブルだけが構造化オーバーレイではない。 階層化モデル (Towards a Common API for Structured Peer-to-Peer Overlays) 僕の研究 (P2PDB) に使えそうな構造化オーバーレイの実装は・・・ • Overlay Weaver • Bamboo DHT – 手始めに Third Trial - Experimental Network からやってみようか? ようやくターゲットが決まりそうな・・・

前回・前々回のフォローアップ

• Third Trial - Experimental Network のその後 – 最小限台数のマシンは確保したんだけど・・・ • Overlay Weaver のその後 – – 多少の実験はしました。 複数ノードで OW を同時に起動するツールも作ったんだけど・・・ • Chord/DHash & CFS のビルドのその後 – 8/4/2003 のスナップショットを使えば何の問題もなくビルドできることを発見 !!

– でも今更 Chord/DHash には戻れないよね・・・ • などなど店ざらしだらけだけど、実は様々な紆余曲折がありまして・・・ 結局 Bamboo DHT に取り組むことになりました。

Bamboo DHT

(1)

• Sean Rhea がメンテナンスしていた DHT 実装

– Churn 耐性を考慮した Pastry の拡張 – Chord/DHash の機能もかなりパクってます ストレージ管理とか、 Vivaldi とか・・・ – 「独自の DHT 実装と考えてもらっても良い」というのが開発者の弁

• OpenDHT ( http://opendht.org/ ) のエンジン

– PlanetLab の上で稼動する公開 DHT サービス – Sun ONC RPC と XML-RPC の2種類のインターフェースが利用可能

• イベント・ドリブン・アーキテクチュアに基づく実装

– 実装言語は Java です。

Bamboo DHT

(2)

• 単に Bamboo を使いたいだけなら・・・ – OpenDHT を使いましょう http://opendht.org/users-guide.html

• 取りあえず自前で Bamboo を動かすためには・・・ – ソースはスナップショットの形でのみ公開 ( 2006March3 が最新版) http://bamboo-dht.org/download.html

– ビルドとテスト・ランはユーザーガイドを見れば何とかなります http://bamboo-dht.org/users-guide.html

• ここまでは比較的楽だったんだけど Bamboo 内臓のシミュレータを動かすとなると・・・ – – どこにもドキュメントがありません ソースコードが最高のドキュメント?

Bamboo DHT

(3)

• Bamboo のプログラミングに関してドキュメントを探してみると・・・ • • • 概要はプログラマーズ・ガイドで解説されてます http://bamboo-dht.org/programmers-guide.html

ホームページのチュートリアルはプログラミングに関するトピックです http://bamboo-dht.org/async-tutorial/async-tutorial.pdf

http://dspace.info.gscc.osaka-cu.ac.jp/brocken/doc/bamboo/async-tutorial/async-tutorial.html

マルチキャストを扱う Tier 1 Abstraction の開発レポートもあります http://www.cl.cam.ac.uk/research/srg/netos/futuregrid/dischinger-report.pdf

• と言うわけで、ひと通り読んでみたんだけど・・・ – – わかったような?わからないような? なんと言っても最高のドキュメントはソースコード?

Java2C++

プロジェクト(1)

• Bamboo の

– – – –

Java コードを

「何でまた・・・」 「冗談でしょ?」

C++ に書き直してみる試み

「そんなことをやろうと思う人はいない」 ・・・などなど、当初からひどい言われようでした。(今でも)

• が、本人的には、いたってまじめに取り組んでます

– 実はこれまでオブジェクト指向型プログラミングをやったことがない – Bamboo に限らず最近の研究目的の実装は圧倒的に – Java 「ソースを読む」と言うだけでは挫折しそうな分量と複雑さ

• で、結果的に

– Bamboo の構造は概ね理解できてきたような・・・

Java2C++

プロジェクト(2)

• • • • 取りあえず Bamboo のシミュレータを動かすことに挑戦 – Bamboo/src/bamboo/sim/make-startup-test.pl

動くことを発見 !!

(何故か Sean Rhea は を使うとシミュレータが Bamboo Sim の使い方を p2p-hackers メーリングリストにポストしていた) ソースコードは 2005July1 スナップショットをベースに – それよりも新しいスナップショットではシミュレータが動かなかった スナップショットに含まれていないソースコードは・・・ – OceanStore のディストリビューションはコードが古すぎる – 結局 Tapestry 2.0.1 からパチって来た( seda/ostore/soss ) http://current.cs.ucsb.edu/projects/chimera/download.html

それでも整合しないファイルは・・・ – 例えば なんで bamboo/src/ostore/util/NodeId.java

java/net/InetSocketAddress を継承してるねん !!

– Jad を使ってスナップショットに収録されているクラス・ファイルをデコンパイル

Bamboo DHT

の実装技術

• Bamboo DHT は次の4つの実装技術から成り立っています – SEDA (Staged Event-Driven Architecture) http://www.eecs.harvard.edu/~mdw/proj/seda/ – OceanStore http://oceanstore.cs.berkeley.edu/ – libasync (SFS: Self-certifying File System) http://www.fs.net/sfswww/ – Bamboo DHT original code http://bamboo-dht.org/ http://opendht.org/ • SEDA と 実は libasync OceanStore に関しては明示的に言及されているけど、 の資産がかなり多く流用されています。

SEDA – Staged Event Driven Architecture

• ホームページ: http://www.eecs.harvard.edu/~mdw/proj/seda/ • イベント・ドリブン・アーキテクチュアとは・・・ – – – 複数のコンポーネントをイベントを介して統合させるパラダイムだそうです イベントによりコンポーネントの非同期的な結合が可能なので・・・ 処理の並列化によるパフォーマンスの向上が期待できる・・・らしい • SEDA の場合は・・・ – コンポーネントの単位として Stage が定義されてます – 各々の Stage では Sink と呼ばれるイベント・キューを用意します – Stage ごとにスレッドを起動すればソフトウェア全体は並列的に動作する? • でも・・・ Bamboo は原則的にはシングル・スレッドで動いているようだし、 SEDA のルールにそれほど厳格に従っているわけでもなさそうです。

Bamboo DHT

のステージ

• Bamboo では次のようなステージなどが定義されています。 – Network – Rpc – Router – DataManager – StorageManager – Dht – Gateway – WebInterface – Vivaldi A UDP-based network layer for Bamboo. A simple mechanism for associating request and response messages The routing and dynamic ring maintenance code for Bamboo. Manages the data stored on Bamboo nodes.

An asynchronous interface to BerkeleyDB. Distributed hash table layer for Bamboo.

A gateway to access the DHT using Sun RPC over TCP. A web interface to the router's state.

A stage that implements the Vivaldi virtual coordinate system • Bamboo のコンフィグ・ファイル( bamboo/test/location-test-node.cfg とか) を見ると良くわかります

Stage

に関連したポイント

• SEDA はむやみやたらとインターフェースを定義します

– そのソースは src/seda/sandStorm/api の下にまとめられています – 特に重要なのは・・・ • EventHandlerIF.java

ステージの定義 • QueueElementIF.java

メッセージ(イベント)の定義 – 中身が空のインターフェースが多いし・・・

• Bamboo の Stage に関する解説があります

– http://bamboo-dht.org/md-tutorial/md-tutorial.pdf

http://dspace.info.gscc.osaka-cu.ac.jp/brocken/doc/bamboo/md-tutorial/md-tutorial_jp.html

– Bamboo に特化した十分ではないけどかなり網羅的な解説です – StandardStage は bamboo/util/StandardStage.java にあります – Bamboo のソースを読むなら先に頭に入れておくべき

OceanStore • 前々回でも紹介した UC バークレイの分散ストレージです

http://oceanstore.cs.berkeley.edu/

• 次の実装が公開されています

– Soss – Pond – Simple Oceanstore Simulator OceanStore Prototype これの開発って続いているんだろうか?

• Bamboo では OceanStore のソースコードを流用しています

– Sean Rhea は OceanStore の開発にも参加していたので、 自分の書いたコードを使うのは当然ちゃあ当然 – Tapestry も OceanStore のソースコードを流用 – – 困ったことにチョコチョコっと直して使ったりする その結果・・・似て非なるバージョンが無数にできたり

Classifier & TypeTable

• この2つは Bamboo において最も重要な OceanStore 資産です • Classifier はイベントを適切な Stage に配送するディスパッチャーです – – – – ディレクトリ src/ostore/dispatch の下に関連するソースが収まっています 配送ルールは各 Stage が定義したテーブルに基づきます ( http://bamboo-dht.org/md-tutorial/md-tutorial.pdf

参照) 同一のイベントを複数の Stage に同報的に配送したり・・・ 適切なクラスが定義されてなければ継承関係を遡って 最も近いと思われるクラスに配送したり・・・ – あまりに多機能なので中身がどう動いているのか未だに良くわからん • TypeTable はイベントを定義するクラスを定義したテーブルです – デシリアライズの際に適切なクラスを選択するときに使われるみたい・・・ – Classifier と根っこで繋がっているみたい・・・ – これも難解すぎて未だに良くわからん • Sean Rhea も「敢えてさわりたいとは思わない」とどっかに書いてました

libasync

• • • • • • Chord/DHash に使われているイベント・ドリブン・コアです 元々は

Self-certifying File System

( http://www.fs.net/sfswww/ )の ために開発されました ソケットやタイマーからイベントが発生した場合、予め登録しておいた ハンドラを実行する機能を提供します – 中身は UNIX の select システムコールを使ったマルチプレクサです ファイルシステム実装のためのツールキットしても紹介されています – http://www.usenix.org/publications/library/proceedings/usenix01/mazieres/mazieres.pdf

プログラミングのためのチュートリアルがあります – – http://dspace.info.gscc.osaka-cu.ac.jp/brocken/doc/sfs/libasync.pdf

http://dspace.info.gscc.osaka-cu.ac.jp/brocken/doc/sfs/libasync.html

非同期IOに基づくプログラミング・スタイルを使います – – ソフトウェアはIOに伴う待ち(ブロッキング)から開放されます ソースはIOの要求処理と完了後処理に分断されます

ASyncCore

• • Bamboo が使用するイベント・ドリブン・コアです アブストラクションは 実体は bamboo/src/bamboo/lss/ASyncCore.java

、 bamboo/src/bamboo/lss/ASyncCoreImpl.java です • Java 実装なので nio を使って libasync と同等の機能を実装しています • Sean Rhea は Bamboo のイベント・モデルについて次のように述べています – OceanStore から派生した Bamboo は SEDA のプログラミング・スタイルを踏襲している – しかし libasync のプログラミング・スタイルのほうが簡潔で効率的(少なくともユニ CPU では) – Bamboo は両者が共存するハイブリットなプログラミング・スタイルを採用している • libasync に注目するその理由は・・・ – P2P システムでは多数のノードとの通信が必須であるが、一般的なマルチ・スレッドによる ネットワークプログラミングでは接続ノード数が増えるに従って効率が低下する。それは スレッドがカーネル・レベルでサポートされていることに起因してると思われる libasync の非同期IOは処理の多重化をアプリケーション・レベルで行うので この問題を回避できる

Brocken – Bamboo by C++

• 原則的に Bamboo の Java コードを逐語訳的に C++ に変換しました • • 現時点で Bamboo のシミュレーション・スクリプトが最後まで実行できます しかもコードは最悪 !!

– String クラスを自前で実装したのが失敗だった – Bamboo のソース全面に散りばめられている様々な形で実装された コールバックを逐語訳的に書き直したので ・・・本人でもあまり見たくない – C++ テンプレートの使用を避けたので 同じようなリストのクラスを山ほど書いた – 書きながら Java と C++ を勉強したので、その他にもおかしなところ満載 • ソースコードは公開するか思案中・・・ハッキリ言ってお勧めできないです

Gryffon – rewriting version of Brocken • 結局、 Brocken のリライトを決意しました • 現在、作業中 - ASyncCore は何となく動いてます • 作業途上なんだけど・・・近日中にソースコードを公開するつもり

– – – これを題材に小規模な勉強会をやりたいなぁと思ってます 過去1年ぐらい頑張ってきたけど、一人で「コンダラ」は疲れた 手伝ってくれなくてもいいから、雑談の相手が欲しい

• 関心のある方は・・・ MIXI のお友達になってください

おわり