同期的にアドバイスを活性化できる分散動的アスペクト

同期的にアドバイスを活性化できる
分散動的アスペクト指向システム
理学部 情報科学科
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