同期的にアドバイスを活性化できる分散動的アスペクト指向システム 理学部 情報科学科 04_25142 森田 悟史 指導教員 千葉 滋 准教授
分散 Dynamic AOP 実行中にアスペクトを織り込む 全ノードで同期的にアスペクトを活性化 例: 各ワーカノードが分散並列で同期しながら計算を 実行 視覚化アスペクト 途中経過を随時マスタノードに集めて視覚化 各ワーカノードで活性化がずれると… 各ノード: for ( i = 0; i < MAX; i++) { //他ノードとデータを交換 exchangeData(data); calculate(data); } アスペクト マスタ ワーカ
素朴な実装1: ループカウンタによる同期 ある値を超えたら活性化する ×長い間待つ ×すでに超えている 各ノード: for( i = 0; i < MAX; i++){ //他ノードとデータを交換] exchangeData(data); calculate(data); } aspect DrawAspect { public void advice(){ // アドバイス処理 }} if( i > 100) advice();
素朴な実装2: ウィーバー による同期・活性化の自動化 非活性なアスペクト バリア同期 全ノードのアスペクトが起動されるまで停止 起動された 活性化 タイムアウト 非活性のまま 実行しない 一部ノードで織り込みが未完 アプリケーション自身の同期のため タイムアウト ×各ノードの停止時間が長い ×タイムアウトの時間設定が難しい 織り込み時点 実行可否判断 ノード A ノード B ノード C i = 101 同期 i = 102
分散 DAOP システム D&D の提案 同期活性化を指定する特別なポイントカットを提供 停止時間の短縮 実装 (Distributed and Dynamic) 同期活性化を指定する特別なポイントカットを提供 アプリケーション情報をウィーバーに教えて活性化を同期 アプリケーションの同期を利用 システムが自動で同期を行う syncMethod 活性化ポイントカット 同期を実行するメソッドを指定 loopCounter 活性化ポイントカット ループ・カウンタを指定(フィールドのみ) この他 woven, activated また、非活性化を同期させることも可能 実装 Java 言語用 バイトコードを変換し、HotSwap で実行時に置換 停止時間の短縮
syncMethod 活性化ポイントカット アプリケーションの同期を実行するメソッド( )を選択 同期の基準にするメソッド アドバイス( )を実行するジョインポイントとは異なる ノード 時間 ノードへの織り込み状況を把握 実行の可否確認 (織り込み完了の通知) false なのでなにもしない マスタ ノード 実行の可否(false) 同期メソッド呼び出し通知 同期 実行の可否確認 実行の可否(??) 同期メソッドを基に活性化判断 織り込み時点 アドバイス 同期メソッド
syncMethod を用いた活性化の同期 マスタノードが活性化のタイミングを管理 全ノードに織り込みが完了したら… 各ノードの同期メソッド呼び出し状況を収集 アドバイスの活性化を各ノードに許可 ノード A ノード B ノード C 全ノードへの織り込み完了後、 全ノードの同期メソッドが 呼ばれたか? 時間 同期 マスタノード 実行の可否確認 false 活性化 true 織り込み時点 アドバイス 同期メソッド
実験 活性化後のアドバイス実行のオーバーヘッドの測定 活性化までにかかる時間を測定 計算1ループ+描画処理にかかる時間(ms) 描画処理の手動での織り込み、本システムでの織り込み 計算1ループ+描画処理にかかる時間(ms) 活性化までにかかる時間を測定 素朴な実装で活性化した場合と比較 実験環境 InTrigger hongo から 50 台 OS: Debian CPU: Pentium M 1.8GHz, メモリ: 1GB N 体問題計算を質点 5000 個で実行
活性化後のアドバイス実行のオーバーヘッド 結果: 特に影響なし バイトコードを直接置き換えているため 活性化同期処理のコードは活性化後に取り除かれる D&D での織り込み D&D 描画コード 平均 標準偏差 on 織り込み 2021 47.71 実装済み 49.87 手動での織り込み
活性化までにかかる時間 素朴な実装に比べ、安定した時間での 活性化 素朴な実装では、タイムアウトの時間に よってばらついた 平均して1ループ分の遅れ(約 2000 ms) 織り込み確認のため 素朴な実装では、タイムアウトの時間に よってばらついた D&D syncMethod 素朴な実装 タイムアウト 3000 ms 素朴な実装 タイムアウト 100 ms
関連研究 DJcutter [Nishizawa ら ‘04] JAC [Pawlak ら ‘04] 分散対応のポイントカット (Remote Pointcut) Dynamic ではない JAC [Pawlak ら ‘04] 分散 DAOP システム 遠隔ホストのジョインポイントを選択できない 活性化のタイミングは、分散を意識して制御する必要 DJAsCo [Navarro ら ‘06] 分散対応の DAOP システム Remote Pointcut 活性化のタイミングは、開発者による制御が必要
まとめと今後の課題 分散 DAOP システム D&D の提案 同期活性化を指定するポイントカットを提供 今後の課題 アプリケーション情報をウィーバーに教えて活性化を同期 低いオーバーヘッド 今後の課題 さらなる実験 アスペクトの織り込みによるアプリケーションの実行時間への影響 ケーススタディの充実 活性化のタイミングを調整したい場合はどんな時か 汎用性を高めるためには何が必要か ネットワークのオーバーヘッド対策
D&D を用いることによるオーバーヘッド 結果: 約2% –javaagent オプションによるものと考えられる D&D on D&D 平均 標準偏差 on 1929 39.91 off 1886 40.08 D&D off
D&D を用いた描画機能の追加 同期メソッドを利用し た活性化 String[] hosts = ポイントカット new String[] {/*hongo001, hongo002, ....... */}; Pointcut pc = Pcd.execution(“nbody.NBodyCalc”, “calc”, hosts); ActivationPointcut apc = Apcd.syncMethod(“nbody.NBodyCalc”, “sync”); Advice drawAdvice = new BeforeAdvice<LinkedList<Satellite>> (``satellite‘’, ``drawAdvice‘’, pc,apc) { @Override public void advice(LinkedList<Satellite> satellites){ drawSatellite(satellites); } }; setAdvice(drawAdvice); ポイントカット 同期メソッドを利用し た活性化 活性化の条件 public class DrawAspect extends Aspect { public DrawAspect() { } drawSatellite(LinkedList<satellites> s) { // 描画処理 アドバイス アスペクトの記述 ちなみに、N体問題アプリケーションへ描画機能を追加する場合は、本システムを用いてこのようにアスペクトを記述することができます。 アドバイスの登録
loopCounter ループカウンタを指定する 指定した値がアスペクトホストに送信される 活性化するのは値が一致した後 Node A Node B Node C time weave i = 101 実行可否判断 同期 i = 102 Activation i = 103