1 / 22

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Java プログラムの再起動 • アプリを JVM 上に再ロード、再実行 • アプリケーションサーバや DI コンテナで利用 • 例)JBoss AS、Seasar2 • HOT deploy • サーバを稼働させたままコンポーネントを再配備 • 例)リクエストの度にアプリを再ロード • 対話的な開発に有用

  3. 修正したアプリケーションの再ロード • 新たに作成したクラスローダでロード • 同じローダで同一名のクラスの再ロード不可能 • 全クラスを再ロード • サーバのパフォーマンスを低下させる • HealthWatcher [Greenwoodら ‘07] を使った実測値 リクエストの度に 平均応答時間(ms)

  4. ロード済みクラスの再利用 • ローダは親ローダにクラスのロードを委譲可能 • 親ローダがクラスをロード済みなら子ローダはロードせずに済む • クラスのロード手順 • 自身でロード済みならば、そのクラスを使用 • 独自の探索方法でクラスを探索する • 親ローダの loadClassメソッドを呼び出す

  5. 再ロードするクラス数の削減法 手法 1 • 変更したクラスと依存しているクラスのみを新ローダでロード • その他は親ローダでロード済みのクラスを再利用 • 旧版アプリの部分的な再利用 • アプリのロードを複数ローダに分割 • ロード済みのクラスを出来るだけ再利用 • アプリの再起動を高速化 手法 2

  6. 手法 1 依存しているクラスもロード • クラス内の参照はそのクラスをロードしたローダが動的に解決 • シンプルな実装では期待する動作は得られない A は親がロードした B を参照 A B C 親 アプリの開始ノード アプリの開始ノード 変更したBは参照不可 変更したBを参照可能 B B A 子 A は変更した B を参照

  7. 手法 2 旧版アプリの部分的な再利用 • 前提 • 各クラスに異なる機能を実現する複数の版がある • 各クラス異なる版の組み合わせで何度も再起動 • 例)クラス A は版 1、クラス B は版 2 で再起動   次は A は版 2、B は版 1 で再起動 • ユーザによるヒント • どのクラスの版を変更するか • アイデア • クラスの版毎にクラスローダを作成 • 再起動時に親ローダとして活用

  8. 手法 2 再起動時に使用する子ローダの作成 (1) 入力 • クラスの版の集合とそれぞれの優先度 • 優先度は事前に計算しておく • 例 1)クラスの版と依存するクラスのサイズの合計 • 例 2)クラスの版の利用されやすさ • アプリケーションを再ロードするクラスローダ • 旧版アプリのローダ群を親ローダとして活用 出力

  9. 手法 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 出力 出力

  10. 手法 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 再ロードするクラス数

  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を用いて再起動 System System 手法 1 手法 2 C1 A1 A1 A1 B1 B1は不必要 C1 C1 B1 再ロードするクラス数 : 手法 1 > 手法 2 クラスローダ数 : 手法 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 実験 • フレームワークに提案手法をそれぞれ実装 • 全クラスを再ロード(手法 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 F C Servlet

  17. 平均応答時間(手法 2)と新版クラス使用数 • 新版クラス使用数 = n + m • 平均応答時間は変更されるクラス数に比例 • 横軸:新版クラスの選択パターン • 平均応答時間で昇順にソート 新版クラス使用数 (線形回帰直線)

  18. 3 つの手法の平均応答時間の比較 • どの選択パターンでも手法 1 と 2 は手法 0 より高速 • 手法 1 と 2 は選択パターンによって使い分ける必要 手法 0 (線形回帰直線) 手法 1 (線形回帰直線)

  19. 手法 1 と手法 2 の使い分け • ほとんどの選択パターンで手法 2 が高速 • 新版クラス使用数が 56 個(全クラスの 76%)以上のとき手法 1 が高速 • 但し、n << m のときは手法 2 が高速 手法 1の平均応答時間 (線形回帰直線) 56 手法 2の平均応答時間 新版クラス使用数 新版クラス使用数 (線形回帰直線)

  20. 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クラス

  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

More Related