22
部部部部部部部部部部 Java 部部部部部部部部部部部部部部部 部部 部部部部部部 部部部部部 09M37264 部部 部部 部部部部 部部 部 部部

部分的再ロードによる Java プログラムの再起動の高速化手法

Embed Size (px)

DESCRIPTION

部分的再ロードによる Java プログラムの再起動の高速化手法. 数理・計算科学専攻 千葉研究室 09M37264  別役 浩平 指導教員 千葉 滋 教授. Java プログラムの再起動. アプリを JVM 上に再ロード、再実行 アプリケーションサーバや DI コンテナで利用 例) JBoss AS 、 Seasar2 HOT deploy サーバを稼働させたままコンポーネントを再配備 例)リクエストの度にアプリを再ロード 対話的な開発に有用. 修正したアプリケーションの再ロード. 新たに作成したクラスローダでロード - PowerPoint PPT Presentation

Citation preview

Page 1: 部分的再ロードによる Java  プログラムの再起動の高速化手法

部分的再ロードによるJava プログラムの再起動の高速化手法数理・計算科学専攻 千葉研究室09M37264  別役 浩平指導教員 千葉 滋 教授

Page 2: 部分的再ロードによる Java  プログラムの再起動の高速化手法

Java プログラムの再起動•アプリを JVM 上に再ロード、再実行▫アプリケーションサーバや DI コンテナで利用▫例) JBoss AS 、 Seasar2

•HOT deploy▫サーバを稼働させたままコンポーネントを再配備▫例)リクエストの度にアプリを再ロード

対話的な開発に有用

2

Page 3: 部分的再ロードによる Java  プログラムの再起動の高速化手法

修正したアプリケーションの再ロード•新たに作成したクラスローダでロード▫同じローダで同一名のクラスの再ロード不可能

•全クラスを再ロード▫サーバのパフォーマンスを低下させる▫HealthWatcher [Greenwood ら ‘ 07] を使った実測値

3

しない場合

再ロードする場合

0 50 100 150 200 250 300

12

261

平均応答時間 (ms)

リクエストの度に

Page 4: 部分的再ロードによる Java  プログラムの再起動の高速化手法

ロード済みクラスの再利用•ローダは親ローダにクラスのロードを委譲可能▫親ローダがクラスをロード済みなら子ローダは

ロードせずに済む

•クラスのロード手順

4

1. 自身でロード済みならば、そのクラスを使用

2. 独自の探索方法でクラスを探索する3. 親ローダの loadClass メソッドを呼び出す

Page 5: 部分的再ロードによる Java  プログラムの再起動の高速化手法

•変更したクラスと依存しているクラスのみを新ローダでロード▫その他は親ローダでロード済みのクラスを再利用

•旧版アプリの部分的な再利用▫アプリのロードを複数ローダに分割

•ロード済みのクラスを出来るだけ再利用▫アプリの再起動を高速化

5

手法 1

手法 2

再ロードするクラス数の削減法

Page 6: 部分的再ロードによる Java  プログラムの再起動の高速化手法

依存しているクラスもロード•クラス内の参照はそのクラスをロードした

ローダが動的に解決▫シンプルな実装では期待する動作は得られない

6

A は親がロードした B を参照

変更した Bは

参照不可

A B C

BB

アプリの開始ノード

A は変更した B を参照

A

アプリの開始ノード

変更した B を参照可能

手法 1

Page 7: 部分的再ロードによる Java  プログラムの再起動の高速化手法

旧版アプリの部分的な再利用•前提

1. 各クラスに異なる機能を実現する複数の版がある2. 各クラス異なる版の組み合わせで何度も再起動

例)クラス A は版 1 、クラス B は版 2 で再起動   次は A は版 2 、 B は版 1 で再起動

3. ユーザによるヒント どのクラスの版を変更するか

•アイデア▫クラスの版毎にクラスローダを作成▫再起動時に親ローダとして活用

7

手法 2

Page 8: 部分的再ロードによる Java  プログラムの再起動の高速化手法

•クラスの版の集合とそれぞれの優先度▫優先度は事前に計算しておく

例 1 )クラスの版と依存するクラスのサイズの合計 例 2 )クラスの版の利用されやすさ

•アプリケーションを再ロードするクラスローダ▫旧版アプリのローダ群を親ローダとして活用

8

手法 2

入力

出力

再起動時に使用する子ローダの作成 ( 1 )

Page 9: 部分的再ロードによる Java  プログラムの再起動の高速化手法

• [ 初期状態 ] システムクラスローダ1個▫原版クラス( A0 、 B0 、 C0 、…)をロード済み

System

A の版 1 をロード

B2 、 A1

( 優先度 : B2 > A1)

B2 、 E3 、 D2

( 優先度 : B2 > E3 > D2)

B2 、 E3 、 C1

( 優先度 : B2 > E3 > C1)

C1

D2

E3

B2

A1

再起動時に使用する子ローダの作成 ( 2 )

B2 、 E3 は親に依頼B2 は親に依頼

出力

出力 出力

入力

9

手法 2

Page 10: 部分的再ロードによる Java  プログラムの再起動の高速化手法

優先度による再ロードするクラスの削減

•例) 各クラスに依存しているクラス数▫A1 = 52 、 B2 = 38 、 C1 = 27 (優先度 A1 > B2 > C1 )

10

手法 2

System

B2

A1

System

A1

B2

C1

C1

A1

C1

B2

C1

65+ 27 = 92

27+ 79 = 106

再ロードするクラス数>

B2 、 C1A1 、 C1

27

52 38

27 2727

依存しているクラス数

入力

Page 11: 部分的再ロードによる Java  プログラムの再起動の高速化手法

•各ローダがロードするアプリは異なる▫クラス間の依存関係も異なる

•ローダ L がロードするクラス群 S▫ あるクラスの版 C と C の原版に依存しているクラスの集合を SC と

表現する▫ ローダ L がクラスの版 C をロードをするとき、 S ← SC

▫ L の全ての親ローダについて、 親ローダがロードするクラスの版 D が S 内のクラスに参照を持つと

き S ← S + SD とする

クラスの版毎のクラスローダ

11

手法 2

Page 12: 部分的再ロードによる Java  プログラムの再起動の高速化手法

応用: Per-session AOP フレームワーク

•ユーザ毎に機能が拡張された Web アプリを実現▫リクエストの度にクラスローダの作成▫ユーザが選択した機能を実装したクラスの版で置

換▫全クラスを再ロード

•例) iGoogle

12

手法 2

[ 戸部ら ’ 08]

リクエスト

サーバ ユーザ

見え方や機能が異なる

Page 13: 部分的再ロードによる Java  プログラムの再起動の高速化手法

サーバ

大規模ホスティングサービス•例)ショッピングサイト▫サイト(各サイトのユーザ全体)毎に機能を拡張

13

ベースアプリ

サービスベンダー

サイト A

追加したクラス

フレームワークの適用例

異なるローダでロード

サイト B

Page 14: 部分的再ロードによる Java  プログラムの再起動の高速化手法

手法 1 と手法 2 の比較•例) 1 回目は A1 、 B1 、 C0 を用いて再起動    2 回目は A1 、 B0 、 C1 を用いて再起動

14

System

A1

B1

C1

System

A1

B1

A1

C1

C1

B1 は不必要

手法 1 手法 2

再ロードするクラス数 : 手法 1 > 手法 2クラスローダ数 : 手法 1 < 手法 2

Page 15: 部分的再ロードによる Java  プログラムの再起動の高速化手法

実験•フレームワークに提案手法をそれぞれ実装▫全クラスを再ロード(手法 0 )、手法 1 、手法

2▫HealthWatcher を動作( 100 ユーザ)

健康管理用 Web アプリ( 9 KLOC )▫アプリの各クラス用に新版を 1 つ用意

新版と原版の 2 バージョンを持つ▫優先度

クラスの版と依存しているクラスのサイズ × 版の利用者数

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

Page 16: 部分的再ロードによる Java  プログラムの再起動の高速化手法

新版クラスの選択パターン•選択パターン( n, m )毎に平均応答時間を測定▫n … Servlet クラスの新版の選択数▫m … コールグラフ上のクラスの新版の選択数

•例)実験( 2, 5 )▫全ユーザが各々 Servlet クラスの新版から 2 個

コールグラフ上のクラスの新版から 5 個

16

D

B

A

CE

H

GI

FServlet

Page 17: 部分的再ロードによる Java  プログラムの再起動の高速化手法

平均応答時間(手法 2 )と新版クラス使用数

•新版クラス使用数 = n + m•平均応答時間は変更されるクラス数に比例▫横軸:新版クラスの選択パターン

平均応答時間で昇順にソート

17

0

5

10

15

20

25

30

35

40

45

50

新版クラス選択パターン

平均応答時間

(ms)

0

10

20

30

40

50

60

70

80

f(x) = 0.0415296129576416 x + 16.1888865967058

新版クラス選択パターン

新版クラス使用数

(個)

新版クラス使用数 (線形回帰直線 )

Page 18: 部分的再ロードによる Java  プログラムの再起動の高速化手法

3 つの手法の平均応答時間の比較•どの選択パターンでも手法 1 と 2 は手法 0 より高速

•手法 1 と 2 は選択パターンによって使い分ける必要

18

0

5

10

15

20

25

30

35

40

45

50

55

f(x) = 0.0094050814485483 x + 32.0754594916623

f(x) = 0.0175254913377595 x + 12.9185450507161

手法 0

Linear ( 手法 0)

手法 1

Linear ( 手法 1)

手法 2

新版クラス選択パターン

平均応答時間

(ms)

手法 0 (線形回帰直線 )

手法 1 (線形回帰直線 )

Page 19: 部分的再ロードによる Java  プログラムの再起動の高速化手法

手法 1 と手法 2 の使い分け•ほとんどの選択パターンで手法 2 が高速▫新版クラス使用数が 56 個(全クラスの 76% )以

上のとき手法 1 が高速 但し、 n << m のときは手法 2 が高速

19

0

5

10

15

20

25

30

35

40

45

50

0

10

20

30

40

50

60

70

80

手法 1Linear ( 手法 1)手法 2アスペクト使用数Linear ( アスペクト使用数 )

新版クラス選択パターン

平均応答時間

(ms)

新版クラス使用数

(個)

56 手法 1 の平均応答時間(線形回帰直線 )手法 2 の平均応答時間

新版クラス使用数 (線形回帰直線 )

新版クラス使用数

Page 20: 部分的再ロードによる Java  プログラムの再起動の高速化手法

n << m の状況•例)( n 、 m ) = ( 1 、 5 )▫n … Servlet クラスの新版の選択数▫m … コールグラフ上のクラスの新版の選択数

20

A

Servlet クラス 再利用可能

B

C

E

H

D

F

G

I

B

C

E

A

H

D

F

G

ID

B

A

C

E

H

F

G

ID

B

A

C

E

H

F

G

I

Page 21: 部分的再ロードによる Java  プログラムの再起動の高速化手法

関連研究• Dynamic Class Loading in the Java Virtual Machine [Liang ら '98]▫クラスローダのアーキテクチャを提示▫ロードのメカニズムや型の安全性など

• JAsCo [Suvée ら '03]▫ HotSwap を用いた DAOP システム▫ JVM にロード済みの特定クラスの定義を置換可能▫メソッド本体しか変更できない

• Sister Namespace [佐藤ら '05]▫異なるローダでロードされたクラス間のバージョンバリアを緩和▫あるクラスの版のインスタンスを異なる版の変数に代入可能

21

Page 22: 部分的再ロードによる Java  プログラムの再起動の高速化手法

まとめ•再起動を高速化するための手法を提案▫変更対象クラスと依存しているクラスを再ロード▫旧版アプリを部分的に再利用▫実験

既存手法のパフォーマンスを改善 2 手法の優劣が状況によってわかれることが判明

•これまでの活動▫論文

SWoPP ’09 @ 仙台 PRO ’10 @ 宮古島(投稿中)

▫ポスター PPL ’09 @ 高山 AOSD ’10 @ Saint-Malo

22