同期的にアドバイスを活性化できる 分散動的アスペクト指向システム 理学部 情報科学科 04_25142 森田 悟史 指導教員 千葉 滋 准教授 分散 Dynamic AOP • 実行中にアスペクトを織り込む ▫ 全ノードで同期的にアスペクトを活性化 ▫ 例: 各ワーカノードが分散並列で同期しながら計算を 実行 視覚化アスペクト 途中経過を随時マスタノードに集めて視覚化 各ワーカノードで活性化がずれると… 各ノード: for ( i = 0; i < MAX; i++) { //他ノードとデータを交換 exchangeData(data); calculate(data); アスペクト } マスタ ワーカ 素朴な実装1: ループカウンタによる同期 • ある値を超えたら活性化する ×長い間待つ ×すでに超えている 各ノード: for( i = 0; i < MAX; i++){ //他ノードとデータを交換] exchangeData(data); if( i > 100) advice(); calculate(data); } aspect DrawAspect { public void 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 を用いた活性化の同期 • マスタノードが活性化のタイミングを管理 ▫ 全ノードに織り込みが完了したら… 1. 各ノードの同期メソッド呼び出し状況を収集 2. アドバイスの活性化を各ノードに許可 全ノードへの織り込み完了後、 全ノードの同期メソッドが 呼ばれたか? ノード A ノード B ノード C 時間 同期 実行の可否確認 マスタノード 活性化 false true 織り込み時点 アドバイス 同期メソッド 実験 • 活性化後のアドバイス実行のオーバーヘッドの測定 ▫ 描画処理の手動での織り込み、本システムでの織り込み ▫ 計算1ループ+描画処理にかかる時間(ms) • 活性化までにかかる時間を測定 ▫ 素朴な実装で活性化した場合と比較 • 実験環境 ▫ ▫ ▫ ▫ InTrigger hongo から 50 台 OS: Debian CPU: Pentium M 1.8GHz, メモリ: 1GB N 体問題計算を質点 5000 個で実行 活性化後のアドバイス実行のオーバー ヘッド • 結果: 特に影響なし ▫ バイトコードを直接置き換えているため ▫ 活性化同期処理のコードは活性化後に取り除かれる 35 D&D での織り込み30 25 20 標準偏差 on 織り込み 2021 47.71 on 実装済み 2021 49.87 10 5 0 35 30 25 20 15 10 手動での織り込み 5 0 1810 1835 1860 1885 1910 1935 1960 1985 2010 2035 2060 2085 2110 2135 2160 2185 D&D 描画コード 平均 15 活性化までにかかる時間 10 • 素朴な実装に比べ、安定した時間での 活性化 8 6 ▫ 平均して1ループ分の遅れ(約 2000 ms)4 ▫ 織り込み確認のため 2 0 • 素朴な実装では、タイムアウトの時間に よってばらついた 600 10 10 8 8 6 6 4 4 2 2 0 600 2600 4600 6600 8600 10600 素朴な実装 タイムアウト 3000 ms 2100 3600 5100 6600 8100 D&D syncMethod 9600 0 600 2600 4600 6600 8600 10600 素朴な実装 タイムアウト 100 ms 関連研究 • DJcutter [Nishizawa ら ‘04] ▫ 分散対応のポイントカット (Remote Pointcut) ▫ Dynamic ではない • JAC [Pawlak ら ‘04] ▫ 分散 DAOP システム ▫ 遠隔ホストのジョインポイントを選択できない ▫ 活性化のタイミングは、分散を意識して制御する必要 • DJAsCo [Navarro ら ‘06] ▫ 分散対応の DAOP システム ▫ Remote Pointcut ▫ 活性化のタイミングは、開発者による制御が必要 まとめと今後の課題 • 分散 DAOP システム D&D の提案 同期活性化を指定するポイントカットを提供 ▫ アプリケーション情報をウィーバーに教えて活性化を同期 ▫ 低いオーバーヘッド • 今後の課題 ▫ さらなる実験 アスペクトの織り込みによるアプリケーションの実行時間への影響 ▫ ケーススタディの充実 活性化のタイミングを調整したい場合はどんな時か 汎用性を高めるためには何が必要か ▫ ネットワークのオーバーヘッド対策 D&D を用いることによるオーバーヘッド • 結果: 約2% ▫ –javaagent オプションによるものと考えられる 35 30 25 20 15 10 5 2130 2110 2090 2070 2050 2030 2010 1990 1970 1950 1930 1910 1890 1870 1850 1830 0 1810 D&D off 1790 D&D on 40 35 30 25 20 15 10 5 0 40 D&D 平均 標準偏差 on 1929 39.91 off 1886 40.08 D&D を用いた描画機能の追加 • 同期メソッドを利用し た活性化 String[] hosts = ポイントカット new String[] {/*hongo001, hongo002, ....... */}; Pointcut pc = Pcd.execution(“nbody.NBodyCalc”, “calc”, hosts); ActivationPointcut apc = 活性化の条件 Apcd.syncMethod(“nbody.NBodyCalc”, “sync”); public class DrawAspect extends Aspect { アドバイス Advice drawAdvice = public DrawAspect() { new BeforeAdvice<LinkedList<Satellite>> (``satellite‘’, ``drawAdvice‘’, pc,apc) { アスペクトの記述 } @Override drawSatellite(LinkedList<satellites> s) public void advice(LinkedList<Satellite> satellites){ { drawSatellite(satellites); // 描画処理 } } }; } アドバイスの登録 setAdvice(drawAdvice); loopCounter • ループカウンタを指定する • 指定した値がアスペクトホストに送信される ▫ 活性化するのは値が一致した後 Node A weave 実行可否判断 Node B Node C time i = 101 同期 i = 102 Activation i = 103
© Copyright 2024 ExpyDoc