Document

アクセス集中時の
Webサーバの性能に対する
OSの影響
東京工業大学 千葉研究室
日比野秀章 松沼正浩
光来健一 千葉滋
1
アクセス集中によるサービスの滞り
• あるサイトで、
人気イベントのチケット
を販売することにした
?
• チケットを購入しようと
アクセスが集中
• ページの閲覧が急にし
づらくなる
2
チューニングにより調整
• システム変更により問題
が生じる
– E.g. ページを閲覧しづらい
Application
AP Server
• 解決するためにはチュー
ニングが必要
• 手間・労力がかかる
JVM
OS
Hardware
– 各種パラメータの調整
•CPU
•メモリ
•実行スレッド数
•JDBCコネクション・プールの
設定
•クラスタリング
•デプロイメント・ディスクリプタ
•ヒープサイズ
•GCの設定
•カーネルパラメータ
(ファイル数、プロセス数)
•TCP/IPの設定パラメータ
•ソケットのバッファサイズ
3
苦労してチューニングしても
• 実行環境の変更が要求される
– セキュリティの問題によりOSを変更
– 顧客の要望で、OSを変更
– ハードウェアの変更により、ソフトウェアが対応し
なくなる
– JVMの変更
– 等など・・・
挙動が変わってしまう
4
予備実験:OSによる挙動の違い
• 対象とする処理
– 軽い処理:フィボナッチ数の計算
– 重い処理:XMLファイルをパースし、
DOMツリーを100回探索
• リクエストの投げ方
– 軽い処理に常時30
– 重い処理に常時1,5,10,20,40
• 対象とするOS
実行環境
[サーバマシン]
•CPU:Intel Xeon 3.06GHz×2
•メモリ:2GB
•ネットワーク:1000BaseTX
[クライアントマシン×14]
•CPU:Pentium 733MHz
•メモリ:512MB
•ネットワーク:100BaseTX
[Web App サーバ]
– Solaris 9, Linux 2.6.5, FreeBSD 5.2 1,
•Tomcat 5.0.25
Windows 2003 Server Enterprise Edition
[JVM]
•Sun JDK 1.4.2
5
Linux 2.6.5
×1000
×1000
500
落ち込まない 重い処理
400
60
300
40
200
20
100
0
軽い処理の処理数
0
1
5
10
20
80
400
60
300
0
0
1
400
200
100
20
0
0
10
20
20
40
40
重い処理へのリクエスト数
軽い処理
重い処理
100
軽い処理の処理数
落ち込む
×1000
500
300
5
10
Windows 2003 Server
60
40
5
重い処理へのリクエスト数
重い処理の処理数
軽い処理の処理数
100
40
軽い処理
重い処理
80
200
20
FreeBSD 5.2.1
100
1
落ち込む
40
重い処理へのリクエスト数
×1000
500
500
80
400
60
300
落ち込む
40
200
100
20
0
0
1
5
10
20
40
重い処理へのリクエスト数
重い処理の処理数
80
軽い処理
100
重い処理の処理数
軽い処理の処理数
100
軽い処理
重い処理
重い処理の処理数
Solaris 9
チューニングのやり直し
• OSの変更によりWeb App サーバの振る舞いが変
わってしまった
面倒
• 一部(OS)の変更により、影響する他の様々なパラ
メータについても設定を見直さなければならない
– 手間・労力がかかる
• 実行環境の他の部分でも同様のことが起こると考え
られる
7
目標と本発表の内容
• 目標
– 実行環境によらず指定した挙動を実現
• 面倒なチューニングを省略
• E.g. Solarisと同様の振る舞いを、様々な実行環境で実現
– 一部の処理(重い処理)の増加時に、他のサービス(軽い処理)への
影響が少ない
• OS毎に挙動が異なる要因を検証
– 仮説1:ネットワーク処理
– 仮説2:GC
– 仮説3:OSのスケジューラ
8
仮説1:ネットワーク処理の影響
• コネクション失敗や再送の頻度を測定
– リクエストの投げ方
• 軽い処理に常時30
• 重い処理に常時40
– パケット送受信の統計情報を調べる
• クライアントマシン側でnetstatを使用
9
ネットワークの通信の失敗は少ない
Solaris
軽い
処理
接続数
Linux
重い
処理
軽い
処理
重い
処理
FreeBSD
Windows
軽い
処理
軽い
処理
重い
処理
重い
処理
28171
669
1977
834
5945
778
3570
958
0
0
0
0
0
0
0
0
受信セグメント数
140996
3613
10011
4372
29317
4111
17602
5049
送信セグメント数
141196
3723
10080
4485
29981
4218
18145
5208
0
7
0
2
2
4
9
14
接続失敗回数
再送回数
• どのOSの場合も
– 再送はほとんど起きていない
– コネクションの失敗は起きていない
10
仮説1:ネットワーク処理の影響
• ネットワーク処理にかかる時間を測定
– SYNパケットの受信からシステムコールacceptの
完了までにかかる時間の計測
– リクエストの投げ方
• 軽い処理にのみ常時30
• 軽い処理に常時30,重い処理に常時80
– SolarisとLinuxで実験
11
ネットワーク処理の処理時間に
差はない
– 接続失敗回数
– 再送回数
– 処理時間
• ネットワーク処理が要
因とは考えにくい
軽い処理のみ
軽い処理と重い処理
3
処理時間[sec]
• SolarisとLinuxであまり
違いは見られない
2
1
0
Solaris
Linux
12
仮説2:GCによる影響
• GCを止めて同様のプログラムで測定
• 実験①
– javaのloggcオプションにより
GCの情報を収集
• 数値処理に常時80リクエス
トを投げる
GCの回数
45
40
重い処理
数値処理
35
30
• 実験②
– 軽い処理と数値処理で予備
実験と同様の実験
25
20
15
10
数値処理:フィボナッチ数の計算
(軽い処理より重い計算)
5
0
Solaris
Linux
FreeBSD Windows
13
Linux 2.6.5
×1000
×1000
1000
800
60
600
40
20
400
200
0
0
1
5
10
20
120
100
80
落ち込む
60
40
40
200
0
1
10
40
20
800
600
400
200
0
0
1
5
10
20
40
数値処理へのリクエスト数
軽い処理の処理数
落ち込む
1200
1000
数値処理の処理数
×1000
80
60
20
40
Windows 2003 Server
×1000
軽い処理の処理数
5
数値処理へのリクエスト数
FreeBSD 5.2.1
軽い処理
数値処理
600
400
20
0
数値処理へのリクエスト数
120
100
1200
1000
800
軽い処理
数値処理
120
100
1200
1000
40
予備実験の実験結果と800
600
落ち込む
傾向は同じ
400
20
200
80
60
0
0
1
5
10
20
40
数値処理へのリクエスト数
数値処理の処理数
落ち込まない
1200
軽い処理の処理数
軽い処理
数値処理
数値処理の処理数
軽い処理の処理数
120
100
80
軽い処理
数値処理
数値処理の処理数
Solaris 9
GCが原因とは考えにくい
• 重い処理の場合と数値処理の場合で
傾向は同じ
– 重い処理‥‥GCが頻発
– 数値処理‥‥GCはほとんど起きない
GCの有無はあまり関係ない
15
仮説3:OSのスケジューラ
• スケジューリングの待ち時間を測定
– リクエストの受信から、実際のJavaプログラムが
実行を開始するまでの時間
– 特にカーネル内のシステムコールでのスケジュー
リング
カーネル内処理(実行待ち)
Javaプログラム
CPUのみ
accept poll
の完了
recv
・・・
16
スケジューリングが要因の可能性大
軽い処理のみ
• リクエストの投げ方
• SolarisとLinuxで実験
軽い処理の処理時間
– 軽い処理にのみ常時30
– 軽い処理に常時30,
重い処理に常時80
秒
カーネル内処理
秒
軽い処理の処理時間
• スケジューリングの頻度が高
い箇所で処理時間長
Solaris 9
16
14
12
10
8
6
4
2
0
• 実験結果
– Linuxでは、カーネル内の処理
時間が長い
軽い処理と重い処理
Javaプログラム
Linux 2.6.5
16
14
12
10
8
6
4
2
0
カーネル内処理
Javaプログラム
17
スケジューラの違いが原因だとすると
• アプリケーションレベルでスケジューリングすれば、実行環境
によらずに同じポリシーで動作できる
• 簡易制御
– sleep命令を挿入することで強制的に重い処理のスケジューリング頻
度を下げる
• 実験方法
– リソースを大量に使用する処理(重い処理)を一時停止
• 一時停止しない(S0)
• 重い処理の毎回の探索の終り
– 毎回の停止時間は20,40,60,80,100ms (S2,S4,S6,S8,S10)
– リクエストの投げ方
• 軽い処理に常時30
• 重い処理に常時20
18
Solaris 9
400
60
300
40
200
20
100
0
0
S0
S2
S4
S6
S8
80
400
60
300
40
200
20
100
0
S10
0
S0
sleepの入れ方
×1000
100
300
40
200
20
100
0
0
S2
S4
S6
S8
sleepの入れ方
S10
軽い処理の処理数
400
重い処理の処理数
軽い処理の処理数
軽い処理
重い処理
60
S0
S4
S6
S8
S10
Windows 2003 Server
500
80
S2
sleepの入れ方
FreeBSD 5.2.1
×1000
100
500
500
軽い処理
重い処理
80
400
60
300
40
200
20
100
0
0
S0
S2
S4
S6
S8
sleepの入れ方
S10
重い処理の処理数
80
軽い処理の処理数
軽い処理
重い処理
軽い処理
重い処理
重い処理の処理数
×1000
100
500
重い処理の処理数
軽い処理の処理数
×1000
100
Linux 2.6.5
簡単な制御であれば可能
• 挿入するsleepの長さ次第で、OS毎の挙動の
違いを埋められる可能性有
– Sleep命令挿入により
• 軽い処理増
• 重い処理減
20
まとめ
• 目標
– 実行環境によらず指定した挙動を実現したい
• 予備実験
– Web App サーバの振る舞いが実行環境の影響を強くうけ
ることを例示
• 要因検証の実験
– Web App サーバの振る舞いにOSのスケジューラが強い
影響を与えている可能性が高い
• 有効性確認の実験
– アプリケーションレベルのスケジューリング
21
今後の課題:要因の検証
• Web App サーバの振る舞いに強く影響する要
因をさらに検証
– スケジューリングの検証はLinuxでしか行えていな
いが、他のOSでも検証
– 各スレッドのスケジューリングのされ方を調査
• タイムスライスとスケジュールの頻度
– 各OSでのスケジューリングポリシーの調査
– 他のリソースを使用する処理(ディスク等)についても
同様に実験を行い、OS別で比較
22
今後の課題:スケジューラ
• 様々な実行環境でユーザーが指定した挙動
が得られるようにする
– アプリケーションレベルでのスケジューリング
• 例えば、検証実験で行ったsleep命令を利用した制御
– sleep命令の長さ、頻度、場所の検討が必要
• Progress-based regulation [J.R.Doucer 99]を利用した、
サーバの状態に応じた制御
23