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