Document

ウェブアプリケーションサーバの
Degradation Schemeの
制御に向けて
東京工業大学 情報理工学研究科
光来健一 日比野秀章
松沼正浩 千葉滋
1
アプリケーションサーバ

商用サイトの構築


3 層構造
アプリケーションサーバ


DBサーバにアクセス
複雑な計算を伴う動的な
ページ



計算量増加
複数のサービス
リクエスト
の受付
動的なページ
の生成
ファイル
I/O
例:帰り荷 Web
 トラック運送の帰り荷を有効に利用するための B to B システム
 アプリケーションサーバ

様々な条件を考慮したマッチング
2
複数のサービスによる
サーバへの負荷

ウェブアプリケーションサーバで複数のサービス

例:帰り荷 Web



様々な条件を考慮したマッチング
顧客に応じたログインページ
高負荷時に、各サービスの性能が低下

実行環境によって決まる

特定のサービスが優先される


負荷の高い処理が優先されると、全体的に反応時間が悪化
各サービスが公平に処理される
3
degradation scheme

意味

負荷に応じた各サービスの性能低下の度合い


共有するシステムリソースの配分で決まる
制御の必要性

実行環境に依存



開発者とユーザの実行環境は異なる可能性あり
バージョンアップ
サービス内容や実行コンテキストによって異なるべき
4
研究の目標

アプリケーションサーバのdegradation scheme
をミドルウェアで制御



高負荷時の性能を制御
実行環境に依存しない制御
まず、本発表では


複数の OS で degradation scheme が異なることを
確認
OS 間で degradation scheme が異なる要因分析

制御する上で必要
5
実験の説明

目的


OS 間 の degradation scheme の違いを明らかにする
内容



サーバの OS
 Solaris9, Linux2.6.7/2.6.5/2.4.18, FreeBSD5.2.1,
Windows 2003 Server Enterprise Edition
負荷の異なる 2 種類のサービス
 フィボナッチ数の計算(軽いサービス)
 XML ファイルのパース・探索(重いサービス)
ワークロード
 軽いサービスへの並行リクエスト数 = 30
 重いサービスへの並行リクエスト数 = 0 ~ 40
6
OS 間での相違
7
バージョン間での相違
OSによって degradation scheme は変わる
8
OS 間の相違の要因分析

目的

OS 間で degradation scheme が異なる
主な要因を解明


degradation scheme を制御できるようにするため
方法

リクエスト処理時間の内訳を比較


対象:軽いサービスを実行するスレッド
(Solaris 9, Linux 2.6.7)
CPU スケジューリングとシステムコールに関するイベント


Solaris : prex (プロファイリングツール)
Linux : kev (prex と類似のツールを開発)
9
リクエスト毎のスレッド処理時間

リクエストの処理


accept 完了~accept 完了
内訳の特徴

CPU利用時間


ほぼ同じ
待ち時間


ロック待ちがほとんど
ロック待ちは
Linux が 2.6 倍
Solaris Linux
(ms)
CPU
利用時間
待ち時間
3.71
3.91
137
375
(accept)
1.19
2.44
(poll)
0.41
19.4
(ロック)
136
348
2.6倍
10
リクエスト処理中のロック待ち

リクエスト処理中


接続の受付~スレッドプールに入る
ロック待ちシステムコール


mutex_lock, cond_wait (Solaris)
Futex (Linux)
Solaris
Linux
システムコールにかかる時間(ms)
64.6
65.2
システムコールの頻度
1.3
2.9
待ち時間の合計(ms)
82.0
2.2倍
189
11
システムコールの頻度の
差の理由 (1)

Solaris の JVM 1.4.2 の実装


ロック獲得時にシステムコールの発行を抑える
mutex_trylock 関数を呼んでロック獲得を試みる


獲得できなければ、mutex_lock 関数により
システムコール発行
Solaris のスレッドライブラリの実装

アダプティブロック


スピンロックとmutex_lockシステムコールの両方を使用
スピン中に獲得できれば、システムコールを発行しない
12
システムコールの頻度の
差の理由 (2)

Linux では cond_wait システムコールを未実装


4つのロック獲得操作を使用して実装
システムコールの発行頻度増
13
スレッドプール
スレッドプールに入る
スレッドプールから出る
thread-5
thread-1
wakeup
thread-4
thread-3
thread-2
woken up
CPU を獲得
時間
14
スレッドプールでの待ち時間
各スレッドの
処理時間 (ms)
Solaris
Linux
4.34
11.7
2.7倍
待ちスレッドの
平均数
12.7
13.0
待ち時間 (ms)
52.6
154
15
次のスレッドを起こす際に
要する時間の内訳
1.90
4.0倍
7.5216
スケジュールされた延べスレッド数
17
タイムスライス
5.6倍
18
長いタイムスライスの原因

CPUスケジューラの
スレッド優先度管理


Solaris
 頻繁に変動
 頻繁にプリエンプト
Linux
 ほぼ一定
 プリエンプトされない
19
検証実験

目的:



ミドルウェアで degradation scheme を
制御するための第一歩
degradation scheme を変更できるか確認
方法:

Linux 2.6.7 のカーネルを修正



最大タイムスライス 200ms -> 2ms
最小タイムスライス 10ms -> 1ms
同様のワークロードで、スループット・処理時間の
内訳を計測
20
タイムスライスを短くした効果(1)
21
タイムスライスを短くした効果(2)
待ち時間の内訳
スレッドプールでの待ち時間
22
まとめ



degradation scheme を制御する必要性
OS 間での degradation scheme の相違を確認
Linux, Solarisにおける相違の原因解析



ロック待ちシステムコールの発行頻度
 JVM の実装
 スレッドライブラリ (アダプティブロック)
 Linux での cond_wait システムコールの未実装
CPUスケジューラのスレッド優先度
 プリエンプトの頻度に相違
タイムスライスの変更による degradation scheme の
変更
23
今後の展開

ミドルウェアでOSの違いを考慮して
degradation scheme を制御


Java で実装
AOPを利用

バイトコードの様々な箇所へ sleep, yield を挿入


タイムスライスの変更と同様の効果
具体的な制御手法については現在検討中
24
関連研究

高負荷時のウェブサーバの挙動



高負荷時のウェブアプリケーションサーバの挙動


DB [McWherter’04]
スケジューリング手法




カーネル内 IO 処理がボトルネック [Almeida’96]
ワークロードによりボトルネックは異なる [Pradhan’02]
shortest-connection-first [Crovella’99]
優先度に基づいたスケジューリング [Elnikety’04]
関数定義によるスケジューリング [Shen’02]
OSのスケジューリングの変更


Gray-Box [Andrea’01]
Infokernel [Andrea’03]
25