200 likes | 320 Views
分散アスペクトの一貫性の保持と停止時間の短縮を考慮した動的織り込み手法 Coordinated Distributed Dynamic Weaving with Minimum Pause Time. 数理・計算科学専攻 千葉研究室 08M37315 森田 悟史 指導教員 千葉 滋 教授. 分散動的アスペクト指向を用いた機能追加. プログラムの振る舞いを実行中に変更 例 : メッセージ送信プログラムへの暗号機能追加 二つのアスペクトで機能を実現 クライアント側:暗号化 サーバ側:復号. Client. Server. メッセージ. 暗号化. 復号.
E N D
分散アスペクトの一貫性の保持と停止時間の短縮を考慮した動的織り込み手法Coordinated Distributed Dynamic Weaving with Minimum Pause Time 数理・計算科学専攻 千葉研究室 08M37315森田 悟史 指導教員千葉 滋 教授
分散動的アスペクト指向を用いた機能追加 • プログラムの振る舞いを実行中に変更 • 例: メッセージ送信プログラムへの暗号機能追加 • 二つのアスペクトで機能を実現 • クライアント側:暗号化 • サーバ側:復号 Client Server メッセージ 暗号化 復号 Client Server 暗号文
追加する(織り込む)暗号化アスペクトの例 アドバイス ポイントカット アスペクト publicaspectEncrypter { void around (String msg): call(void Client.send(String))&&args(msg){ String cipher = encrypt(msg);// 暗号化 proceed(cipher); // 元のメソッドを呼び出す } } 号 復号 class Client { void send (String msg) { … }} ジョインポイント Server 暗号文
研究目的:一貫性を保って織り込む • まだあまり注目されていない • While coordinated weaving *may* be important, it is not necessarily required in all cases. (SC 09 notification) • 片方だけ先に織り込まれると不具合 • 両方のアスペクトが必要 • 織り込みにかかる時間が一定ではない • ネットワークスピードの違い • 巨大な分散環境 • CPU 使用率の違い • Java ベース言語のコード変換 Client Server メッセージ 暗号化 解読不可 Client Server 暗号文
実験:一貫性を保つことの重要性 • InTriggerで実験 • chibaノードから miraiノードへ送信 • 1 ミリ秒に 1 回通信 • ネットワークレイテンシは 27 ミリ秒 • Java ベース言語の場合 (コード変換あり) • 織り込みの瞬間 10 回の暗号化失敗 • CaesarJ [‘03 Meziniら] の場合 (コード変換なし) • 静的に織り込み、動的に有効化 • 有効化の瞬間 1 回の暗号化失敗 二種類の言語で実験
評価軸:一貫性の保持と速度の両立 • 素朴に制御すると難しい • 素朴な方法:全ノードを停止 • 安全なところで止めて織り込み 再開 • パフォーマンスの問題 • アプリケーションを止めてしまう Client Server メッセージ Client Server 停止 暗号化 復号 Client Server 再開 Client Server 暗号文
提案: two phase weaving 機構 一貫性と速度を両立させる手法 • 織り込み制御プリミティブを分割 • アスペクトの準備 (deploy) と有効化 (activate) に分ける • 時間がかかるdeploy を非同期的に行い、activate するタイミングだけを制御する
例: two phase weaving 機構を使った暗号化アスペクトの織り込み deploy Client Server • 実装した織り込みアルゴリズム • それぞれの機能を deploy • isDeployedで織り込み終了を確認 • 受信→送信の順で activate • 受信側アスペクトの工夫 • 織り込み過渡期に対応 STOP メッセージ 暗号化 復号 Client Server メッセージ deploy isDeployed = true Client Server メッセージ activate Client Server 暗号文 activate
例: two phase weaving 機構を使ったロギングアスペクトの織り込み • 実装した織り込みアルゴリズム • アプリケーションの同期に合わせた織り込み • 2つのアスペクトを deploy • 同期のタイミング確認用 • ロギングアスペクト • 同期のタイミングに合わせて activate deploy Join point Calculation Data sending node00 node01 node02 t = 101 sync t = 102 sync activation t = 103 Do not activate
two phase weaving 機構の特徴 • 向いているアプリケーション • 全て織り込まれている or 織り込まれていないことを保証すればよいもの • 途中で状態が変わらない • すべてのプリミティブはブロックしない • プログラムを止めずに一貫性を保てる • 限界 • アドバイス側に、両対応などの工夫が必要なこともある • アプリケーション自体の機構を利用することで工夫がいらない場合もある
実証: DandyJ • two phase weaving 機構を提供する分散DAOP言語 • 言語サポートを提供 • プリミティブのみだと、織り込み制御の記述が複雑になる • 機能と分散処理・織り込み活性化処理が混ざる • deploy, activate, isDeployed+ 補助プリミティブ • Dynamic aspect • Remote pointcut • Onetime aspect
Dynamic aspect • 動的織り込みが可能なアスペクト • First-class aspect • dynamic 修飾子をつける • インスタンス化し、deployや activate の対象にできる • Dynamic aspect は他のコードから織り込みを操作可能 • アスペクトでモニタリングを行い activate できる • モニタリングアスペクトの実装 • モニタリングを分離できる Encrypter enc = new Encrypter (); enc.deploy(); enc.activate(); ... enc.undeploy(); dynamic aspect Encrypter{ …. }
Remote pointcut [Nishizawa ら ‘04] • 他のノード上のイベントに反応して動くアドバイスが書ける • 分散環境でのモニタリングアスペクトが簡単に書ける • 織り込みのタイミングを集中管理できる • ローカルアドバイスも定義できる • local 修飾子 node00: ... send (); node00 Aspect
Onetime aspect Client Server メッセージ • 一度アドバイスが実行されると自動的に除去される • undeployを明示的に記述する必要がない • モニタリングアスペクトが簡単に書ける • モニタリングアスペクトは将来いらなくなる モニタリング 暗号化 復号 Server Client 暗号文 undeploy Client Server 暗号文
例: DandyJを用いた暗号化アスペクト publicdynamicaspectEncrypter { localvoid around (String msg): client() && args(msg) { // encrypt the message proceed (msg); }} public abstractdynamic onetime aspectServerClient { … before (): server() && if (openPort.isDeployed() && server.isDeployed()) { openPort.activate(); server.activate(); } before (): client() && if(server.isActivated() && changePort.isDeployed() && client.isWoven()) { changePort.activate(); client.activate(); }} publicdynamicaspectDecrypter { local voidaround (String msg, Server s): server() && args(msg) && this(s){ if ( /* ポートで場合分け */ ) { // decrypt the message proceed (msg); } else { proceed(msg); }}}
DandyJの実装 • ddjc: JastAdd版 abcを拡張したコンパイラ • アスペクトでコンパイラーを拡張 • 全体:15万行 追加部分: 約5000行 • ddj: プログラム実行と同時に Runtime system が起動 • Runtime system が動的織り込みを行う • Instrument API で javassistを利用 • 約3000行
実験: 暗号機能の追加 • 1ミリ秒に1回メッセージを送信しているアプリに機能追加 • 3ノードで実験 • chiba:メッセージ送信ノード • mirai:メッセージ受信ノード • chiba:コントロールノード • 織り込み方法 • 制御なし • ブロック • Onetime aspect を用いてコントロール • コントロールするがモニタリングアスペクトを undeployしない • 実験環境 • InTriggerchiba & mirai • OS: Debian • Chiba CPU: Core2Duo 2.13GHz, メモリ: 4GB • Mirai CPU: Xeon 2.33GHz, メモリ: 16GB
実験結果 100 付近で織り込み ブロックによる遅れ • Onetime aspect で一貫性と速度を両立できた 速度× 一貫性○ 速度◎ 一貫性× 時間(ms) Max: 69 Ave: 45.4 Max: 133 Ave: 47.5 時間 (回目) 速度△(約7%) 一貫性○ 速度○ 一貫性○ Max: 71 Ave: 46.6 Max: 75 Ave: 49.6
関連研究 • DyReS [‘08 Truyenら] • XML スクリプトで活性化までの流れを記述 • 遠隔ノードの処理の状況を把握することはできない • スクリプトが複雑になりやすい • CaesarJ [‘03 Meziniら] • 非活性状態のアスペクトを deploy 命令で活性化 • 遠隔ノードの処理の進行状況を集中管理できない • DJAsCo [‘06 Navarro ら] • Remote pointcutを使用できる • フックを活性化する処理をアドバイスとして記述できない
まとめ • 実験を通して、一貫性の保持が必要なことを示した • two phase weaving 機構の提案 • deployと activate を分けることで、一貫性の保持と停止時間の短縮を両立するアルゴリズムを実現可能にした • DandyJでの実証 • 言語として実装 • 実験でパフォーマンスを調査 • 今まで (今後) の活動 • 論文: ソフトウェア科学会大会’08@筑波大、(ECOOP’10@slovenija) • ポスター: PPL’08@仙台、AOSD’09@Charlottesville、(AOSD’10@Saint-Malo) 投稿中 3月