Transcript Document

部分的再ロードによる
Java プログラムの再起動の高速化手法
数理・計算科学専攻 千葉研究室
09M37264 別役 浩平
指導教員 千葉 滋 教授
2
Java プログラムの再起動
• アプリを JVM 上に再ロード、再実行
▫ アプリケーションサーバや DI コンテナで利用
▫ 例)JBoss AS、Seasar2
• HOT deploy
▫ サーバを稼働させたままコンポーネントを再配備
▫ 例)リクエストの度にアプリを再ロード
 対話的な開発に有用
3
修正したアプリケーションの再ロード
• 新たに作成したクラスローダでロード
▫ 同じローダで同一名のクラスの再ロード不可能
• 全クラスを再ロード
▫ サーバのパフォーマンスを低下させる
▫ HealthWatcher [Greenwoodら ‘07] を使った実測値
再ロードする場合
リクエストの度に
しない場合
平均応答時間(ms) 0
261
12
100
200
300
4
ロード済みクラスの再利用
• ローダは親ローダにクラスのロードを委譲可能
▫ 親ローダがクラスをロード済みなら子ローダは
ロードせずに済む
• クラスのロード手順
1. 自身でロード済みならば、そのクラスを使用
2. 独自の探索方法でクラスを探索する
3. 親ローダの loadClass メソッドを呼び出す
5
再ロードするクラス数の削減法
手法 1
• 変更したクラスと依存しているクラスのみを
新ローダでロード
▫ その他は親ローダでロード済みのクラスを再利用
手法 2
• 旧版アプリの部分的な再利用
▫ アプリのロードを複数ローダに分割
• ロード済みのクラスを出来るだけ再利用
▫ アプリの再起動を高速化
6
手法 1
依存しているクラスもロード
• クラス内の参照はそのクラスをロードした
ローダが動的に解決
▫ シンプルな実装では期待する動作は得られない
A は親がロードした B を参照
アプリの
開始ノード
A
B
C
親
変更したBを
変更したBは
参照可能
参照不可
A は変更した B を参照
A
B
子
7
手法 2
旧版アプリの部分的な再利用
• 前提
1. 各クラスに異なる機能を実現する複数の版がある
2. 各クラス異なる版の組み合わせで何度も再起動
 例)クラス A は版 1、クラス B は版 2 で再起動
次は A は版 2、B は版 1 で再起動
3. ユーザによるヒント
 どのクラスの版を変更するか
• アイデア
▫ クラスの版毎にクラスローダを作成
▫ 再起動時に親ローダとして活用
8
手法 2
再起動時に使用する子ローダの作成 (1)
入力
• クラスの版の集合とそれぞれの優先度
▫ 優先度は事前に計算しておく
 例 1)クラスの版と依存するクラスのサイズの合計
 例 2)クラスの版の利用されやすさ
出力
• アプリケーションを再ロードするクラスローダ
▫ 旧版アプリのローダ群を親ローダとして活用
9
手法 2
再起動時に使用する子ローダの作成 (2)
• [初期状態] システムクラスローダ1個
▫ 原版クラス(A0、B0、C0、…)をロード済み
System
Aの版 1 を
ロード
出力
B2
BB22、E
B、E
2、A
33、C
、D
1 12
(優先度:
(優先度:
(優先度:
BB22>B>2EE>33>A>1C)D12))
A1
出力
入力
B23は親に依頼
B2、E
E3
D2
C1
出力
10
手法 2
優先度による再ロードするクラスの削減
• 例) 各クラスに依存しているクラス数
▫ A1 = 52、B2 = 38、C1 = 27 (優先度 A1 > B2 > C1)
System
System
38
52
B2
C1
A1
A1
A1
C1
C1
27 + 79 = 106
>
入力
B2
A
B12、C1
27
27
27
27
依存している
クラス数
B2
65 + 27 = 92
C1
再ロードするクラス数
11
手法 2
クラスの版毎のクラスローダ
• 各ローダがロードするアプリは異なる
▫ クラス間の依存関係も異なる
• ローダ L がロードするクラス群 S
▫ あるクラスの版 C と C の原版に依存しているクラスの集合を SC と表現する
▫ ローダ L がクラスの版 C をロードをするとき、S ← SC
▫ L の全ての親ローダについて、
 親ローダがロードするクラスの版 D が S 内のクラスに参照を持つとき
 S ← S + SD とする
12
手法 2
応用:Per-session AOP フレームワーク
[戸部ら ’08]
• ユーザ毎に機能が拡張された Web アプリを実現
▫ リクエストの度にクラスローダの作成
▫ ユーザが選択した機能を実装したクラスの版で置換
▫ 全クラスを再ロード
• 例)iGoogle
見え方や機能
が異なる
リクエスト
サーバ
ユーザ
13
フレームワークの適用例
大規模ホスティングサービス
• 例)ショッピングサイト
▫ サイト(各サイトのユーザ全体)毎に機能を拡張
サイト A
サイト B
追加したクラス
異なるローダでロード
ベースアプリ
サービスベンダー
サーバ
14
手法 1 と手法 2 の比較
• 例)1 回目は A1、B1、C0 を用いて再起動
2 回目は A1、B0、C1 を用いて再起動
手法 1
A1
System
B1
手法 2
A1
System
C1
A1
B1 は不必要
C1
C1
再ロードするクラス数
クラスローダ数
:
:
手法 1 > 手法 2
手法 1 < 手法 2
B1
15
• 実験環境
▫
実験
Client マシン
 OS : Windows Server 2003
 CPU : Core 2 Duo 3.00 GHz
 Memory : 4 GB
▫
Server マシン
 OS : Linux 2.6.26
 CPU : Xeon 2.83 GHz
 Memory : 4 GB
• フレームワークに提案手法をそれぞれ実装
▫ 全クラスを再ロード(手法 0)、手法 1、手法 2
▫ HealthWatcher を動作(100 ユーザ)
 健康管理用 Web アプリ(9 KLOC)
▫ アプリの各クラス用に新版を 1 つ用意
 新版と原版の 2 バージョンを持つ
▫ 優先度
 クラスの版と依存しているクラスのサイズ × 版の利用者数
16
新版クラスの選択パターン
• 選択パターン(n, m)毎に平均応答時間を測定
▫ n … Servlet クラスの新版の選択数
▫ m … コールグラフ上のクラスの新版の選択数
• 例)実験(2, 5)
▫ 全ユーザが各々 Servlet クラスの新版から 2 個
コールグラフ上のクラスの新版から 5 個
A
G
D
I
B
H
E
Servlet C
F
17
平均応答時間(手法 2)と新版クラス使用数
• 新版クラス使用数 = n + m
• 平均応答時間は変更されるクラス数に比例
▫ 横軸:新版クラスの選択パターン
 平均応答時間で昇順にソート
50
80
45
70
新版クラス使用数(個)
平均応答時間(ms)
40
35
30
25
20
15
10
60
50
40
30
20
5
10
0
0
新版クラス選択パターン
Линейная (アスペクト使
新版クラス使用数
用数)
(線形回帰直線)
y = 0,0415x + 16,189
新版クラス選択パターン
18
3 つの手法の平均応答時間の比較
• どの選択パターンでも手法 1 と 2 は手法 0 より高速
• 手法 1 と 2 は選択パターンによって使い分ける必要
55
平均応答時間(ms)
50
45
手法 0
40
手法 1
35
手法 2
30
Линейная (手法
手法 0 (線形回帰直線)
0)
Линейная
(手法
手法 1 (線形回帰直線)
1)
25
20
15
10
5
0
y = 0,0094x + 32,075
y = 0,0175x + 12,919
新版クラス選択パターン
19
手法 1 と手法 2 の使い分け
• ほとんどの選択パターンで手法 2 が高速
▫ 新版クラス使用数が 56 個(全クラスの 76%)以上の
とき手法 1 が高速
 但し、n << m のときは手法 2 が高速
50
80
45
70
40
50
30
25
40
20
30
15
20
10
10
5
0
新版クラス選択パターン
0
56
新版クラス使用数(個)
平均応答時間(ms)
60
35
手法
手法 11 の平均応答時間
(線形回帰直線)
手法
手法 22 の平均応答時間
新版クラス使用数
アスペクト使用数
新版クラス使用数
Линейная
(手法 1)
(線形回帰直線)
20
n << m の状況
• 例)(n、m) = (1、5)
▫ n … Servlet クラスの新版の選択数
▫ m … コールグラフ上のクラスの新版の選択数
A
G
D
I
B
H
E
C
Servlet クラス
F
再利用可能
21
関連研究
• Dynamic Class Loading in the Java Virtual Machine [Liangら'98]
▫ クラスローダのアーキテクチャを提示
▫ ロードのメカニズムや型の安全性など
• JAsCo [Suvéeら'03]
▫ HotSwap を用いた DAOP システム
▫ JVM にロード済みの特定クラスの定義を置換可能
▫ メソッド本体しか変更できない
• Sister Namespace [佐藤ら'05]
▫ 異なるローダでロードされたクラス間のバージョンバリアを緩和
▫ あるクラスの版のインスタンスを異なる版の変数に代入可能
22
まとめ
• 再起動を高速化するための手法を提案
▫ 変更対象クラスと依存しているクラスを再ロード
▫ 旧版アプリを部分的に再利用
▫ 実験
 既存手法のパフォーマンスを改善
 2 手法の優劣が状況によってわかれることが判明
• これまでの活動
▫ 論文
 SWoPP ’09 @ 仙台
 PRO ’10 @ 宮古島(投稿中)
▫ ポスター
 PPL ’09 @ 高山
 AOSD ’10 @ Saint-Malo