J2EEアプリケーションにおける アプリケーションレベルスケジューリング 東京工業大学 千葉研究室 日比野秀章 光来健一 千葉滋 2006/1/27 DSW 2006 1 過負荷時のJ2EEサーバ 過負荷が原因で近年起きた事件 地震計ネットワークシステム 震度計の増加に伴う負荷の増大で、データ送信に遅 れ 当初の予想より負荷が増大 東証、株式全取引停止 株式売買の注文が殺到し、システムの処理能力が限 界 リクエストの増大 過負荷になると重要な処理が遅延 震度の高い地点のデータも遅延 ライブドア以外の注文も遅延 2006/1/27 DSW 2006 2 過負荷を改善する一般的な手法 一般的な手法 ハードウェアの追加 選定、追加開発に時間がかかる 購入予算がかかる アプリケーションの抜本的改修 軽量化、クラスタ化、多階層化(負荷分散) 検証に時間がかかる 改修の費用がかかる 商用システムでは、正常動作と収益が密接 対処の遅れは、大きな損失につながる 2006/1/27 DSW 2006 3 過負荷に対処する安価な対処法 QoS 制御を後から追加して対処 アドミッションコントロール 重要度の高い処理を優先する 追加する際の用件 アプリケーションのコードの変更を避ける 動いているロジックを壊す危険性を縮小 OS・ミドルウェアの大幅な変更を避ける 検証時間を短縮 E.g. リアルタイム機能を持つOS・ミドルウェアに変更 2006/1/27 DSW 2006 4 アスペクト指向プログラミング(AOP)を用いた アプリケーションレベルスケジューリング アプリケーションレベルでスケジューリング OS・ミドルウェアの変更不要 アスペクトを利用してJ2EEアプリケーションとスケ ジューラを結合 アプリケーションのコード書き換えが不必要 スケジューラを再利用 きめ細かい制御が可能 短い間隔で定期的にスケジューラを呼出す 様々な位置からスケジューラを利用 アプリケーションの情報を利用 2006/1/27 DSW 2006 5 スケジューラ スケジューラ アプリケーションのスレッドを管理 アプリケーションスレッドの登録・削除 スケジューラに処理の開始・終了を 通知 スレッド実行の制御 要求 フラグの一覧 ID false ID false ID true ID false 定期的に呼び出される 実行可能フラグに応じて、自発的に制 御(wait/sleep) Javaのsuspend/resumeが推奨さ れていない 外部からの強制的なスレッド操作 が不可 確認 ID アプリ スケジューリングの変更要求 実行可能フラグを要求に応じて調整 2006/1/27 DSW 2006 ID ID 6 スレッド アスペクト ポイントカット スケジューリング制御を行う 位置 アドバイス スケジューラのメソッドの呼び 出し GluonJ[Chibaら’05]を利用 XMLを用いた記述 void foo(){ void beforeB(); Bar.bar(); void afterB(); } 2006/1/27 アスペクト Schedulerクラス DSW 2006 Fooクラス <glue> <pointcut-decl> <name> point </name> <pointcut> withincode(void Foo.foo()) ANDAND call(void Bar.bar()) </pointcut> </pointcut-decl> <behavior> <around> Scheduler.beforeB(); $_ = $proceed($$); Scheduler.afterB(); </around> </behavior> </glue> 7 スケジューラを呼び出す位置の自動決定 定期的な呼び出し位置を人 手で探すのは面倒 プロファイリング情報から呼び 出し位置を自動決定 1. 2. 3. 呼び出し位置の候補 制御対象処理の実行中に 呼ばれるすべてのメソッド プロファイリング情報 制御対象処理のみを単 独で実行して取る 4. [(n-1/2)T,(n+1/2)T]で分割 出現頻度が1で、nTに近いものを選択 選択数0の区間で、出現頻度が2、以下 の加点が最大になるものを選択 1. 新たに選択された区間の数 2. 削除可能な呼び出しの出現頻度 出現頻度3,4,…,Nで3の繰り返し N:出現頻度の上限 T:呼び出し間隔 ・methodA ・methodB ・methodC 候補となるメソッドの名前 と呼び出し時刻 呼び出し位置の決定方針 一定間隔(T秒) 少なくする 2006/1/27 各区間で呼出しは1回 DSW 2006 (n-1)T nT (n+1)T 8 全体図 1. スケジューラ を作成 5. J2EEサーバに 配置 2. アスペクト を作成 3. プロファイリング 4. 呼び出し位置を 自動決定 Jar J2EE アプリケーション GluonJ 6. weave J2EEサーバ 2006/1/27 DSW 2006 9 収集サーバ 水位監視システム 水位収集 収集サーバ 全国各地に設置 全国の河川に設置された 水位計より情報収集 管理サーバ 収集サーバから定期的に 水位情報を収集 水位情報 DB・メモリに格納 の取得 水位情報の閲覧 クライアント数増加により、 管理サーバで欠測 一定時間内でのデータ取 得に失敗 2006/1/27 DSW 2006 10 管理サーバ グラフ表示ページ 2006/1/27 DSW 2006 11 追加したQoS制御 定期的な水位情報の取得処理を優先 水位取得処理の実行中は、グラフ生成処理の並列処理数 を1に制限、それ以外は40に制限 スケジューラの動作 水位収集処理開始時 グラフ生成処理のスレッドの実行可能フラグを1つ以外 すべてfalse 水位収集処理終了時 計40個の実行可能フラグをtrue グラフ生成処理の途中 定期的に実行可能フラグを確認 2006/1/27 Trueなら処理を継続 Falseなら待機 DSW 2006 12 追加したQoS制御のプログラム <pointcut-decl> <name> lowImportant </name> <pointcut> execution(void PlaceChartCreatePseudActionImpl.execute(..)) </pointcut> グラフ生成 </pointcut-decl> <pointcut-decl> <name> highImportant </name> <pointcut> execution(void CollectorImpl.doObtain()) </pointcut> </pointcut-decl> 水位収集 <pointcut-decl> <name> checkpoint </name> <pointcut> (withincode(Range CategoryPlot.getDataRange(ValueAxis)) ANDAND call(Range Range.combine(Range.Range))) OROR : </pointcut> フラグの確認位置(自動生成) </pointcut-decl> 2006/1/27 DSW 2006 13 追加したQoS制御のプログラム <behavior> <pointcut> lowImportant </pointcut> <around> PriorityPolicy.beforeLowPriority(); $_ = proceed($$); PrioirtyPolicy.afterLowPriority(); </around> </behavior> <behavior> <pointcut> highImportant </pointcut> <around> PriorityPolicy.beforeHighPriority(); $_ = proceed($$); PriorityPolicy.afterHighPriority(); </around> </behavior> <behavior> <pointcut> checkpoint </pointcut> <before>PriorityPolicy.checkpoint();</before> </behavior> 2006/1/27 アスペクト Public class PriorityPolicy { public static void beforeLowPriority() { controller.enter(Thread.currentThread()); } public static void afterLowPriority() { controller.exit(Thread.currentThread()); } public static void beforeHighPriority() { controller.schedule(1); } public static void afterHighPriority() { controller.schedule(40); } public static void checkpoint() { controller.checkpoint( Thread.currentThread()); } } DSW 2006 スケジューラ 14 実験条件 ワークロード グラフ表示ページに対し、リクエストを常に40 水位収集は15秒間隔 制御方式 提案方式(ALS) 実験環境 処理途中で制限できる サーバホスト×2 並列処理数の制限 40⇒1 CPU: 3.06GHz×2 従来のアドミッションコントロール(AC) メモリ: 2GB 処理が終わった時点で制限される クライアントホスト 並列処理数の制限 40⇒1 CPU: 1.53GHz 制御なし(NC) メモリ: 1GB 2006/1/27 DSW 2006 15 水位収集にかかる時間 制御なし(NC) 毎回欠測 AC ALSより時間がかかる ばらつきが大きい 45秒で欠測 提案手法(ALS) 毎回5秒程度 2006/1/27 DSW 2006 16 グラフ生成処理用の 動作しているスレッド数の変化(AC) スレッド数を1に抑える のに時間がかかる 水位収集が終わるまで に抑えられていないこ とも多い 2006/1/27 DSW 2006 17 グラフ生成処理用の 動作しているスレッド数の変化(ALS) スレッド数が短時間で1 に抑えられている 2006/1/27 DSW 2006 18 負荷の違いによる制御への影響 グラフ生成処理に投げるリクエストの数を変えて計測(20 or 40) 水位収集にかかる時間 並列処理数を抑えるのにかかる時間 リクエストが増加した際 2006/1/27 ACでは、かなり時間がかかる ALSでは、比較的短時間で水位収集を終える 水位収集にかかる時間(秒) DSW 2006 19 並列処理数を抑えるのにかかる時間(秒) 選択アルゴリズムのパラメータの影響 DB パラメータにより、呼び出し方 がどう変化するか調べた javax パラメータ 呼び出し間隔 候補にするメソッドの出現 頻度 パラメータにより呼び出し方が 大きく変化 呼び出しの状況から、適切な パラメータを選択 制御不可能な区間 DBアクセス 水位情報の検索 Javax内の処理 画像のエンコーディング 選択された呼び出しが実行された時間 2006/1/27 DSW 2006 20 関連研究 Capriccio [Behrenら’03] アプリケーションに応じたスレッドスケジューリング スレッドが処理するサービスの区別が困難 Gatekeeper [Elnikelyら’04] プロキシをサーバマシン間に挿入して、リクエストスケ ジューリング サーバ内で実行途中での制御が不可 Re-QoS [Tesanovicら’05] 2006/1/27 QoS制御の追加にアスペクトを使用 リクエストのアドミッションコントロールのみ DSW 2006 21 まとめと今後の課題 まとめ アプリケーションレベルスケジューリングを提案 アスペクトを用いてQoS制御を追加 きめ細かい制御 河川水位監視システムに提案手法を適用 過負荷時にQoS要求を満たす 今後の課題 他のアプリケーションにも適用 2006/1/27 DSW 2006 22
© Copyright 2024 ExpyDoc