部分的再ロードによる 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 新版クラス選択パターン Linear (アスペクト使用 新版クラス使用数 数) (線形回帰直線) y = 0.0415x + 16.189 新版クラス選択パターン 18 3 つの手法の平均応答時間の比較 • どの選択パターンでも手法 1 と 2 は手法 0 より高速 • 手法 1 と 2 は選択パターンによって使い分ける必要 55 50 45 手法 0 平均応答時間(ms) 40 手法 1 35 手法 2 30 手法 0(手法 (線形回帰直線) Linear 0) 25 手法 1(手法 (線形回帰直線) Linear 1) 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 新版クラス使用数(個) 平均応答時間(ms) 60 56 35 手法 1 の平均応答時間 手法 1 (線形回帰直線) 手法 手法22 の平均応答時間 アスペクト使用数 新版クラス使用数 新版クラス使用数 Linear (手法 1) (線形回帰直線) Linear (アスペクト使用数) 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
© Copyright 2024 ExpyDoc