...

パフォーマンス設計 WASV6による基幹システム設計Workshop

by user

on
Category: Documents
322

views

Report

Comments

Transcript

パフォーマンス設計 WASV6による基幹システム設計Workshop
WASV6による基幹システム設計Workshop
パフォーマンス設計
Agenda
パフォーマンス設計概要
パフォーマンスデータの取得
パフォーマンステストシナリオ
レスポンスタイムの取得
CPUの確認
メモリの確認
アクセス数、TCPコネクション数の確認
WASのモニタリングツールを用いたパフォーマンスデータの取得
問題解析のアプローチ
Webシステムにおけるチューニング項目
OS
クライアント・Webサーバー間
Webサーバー・アプリケーションサーバー間
JVMヒープ
EJBコンテナー
データベース接続
2
パフォーマンス設計概要
3
パフォーマンス設計
パフォーマンス要件を洗い出し、システム設計を実施
パフォーマンステストを実施し、それらの要件が実システムで満たせていることを確認
満たせていない場合は、ボトルネックを発見し、パラメータチューニングを実施
本番稼動後、パフォーマンスの劣化が発生した場合、問題の分析と解決策を実施
要件定義
パフォーマンス要件の洗い出し
パフォーマンス要件を
実際のシステムに落とし込み
設計
開発
システムの開発
テスト
運用
パフォーマンステストを実施
パフォーマンス要件に満たない場合は
チューニングを実施
本番稼動後のパフォーマンス
の劣化による問題分析
4
パフォーマンステストシナリオ
パフォーマンステストには負荷ツールを用いてサーバーにアクセス。
パフォーマンステストの目的
システムがパフォーマンス要件を満たしていることの確認
ボトルネックを発見し、最適なパラメータ値を決定
パフォーマンストラブルの解決
テスト計画・準備
テストの再検討
負荷ツール、テストシナリオ決定
テスト実施
データの取得
結果の検討
2章:パフォーマンスデータの取得
3章:問題解析のアプローチ
チューニング結果の
確認
チューニング
報告書の作成
4章:Webシステムにおける
チューニング項目
5
テスト要件・シナリオの確定
テストの目的の明確化
キャパシティテスト
限界値の確認
動作確認
テスト範囲、対象サーバー
最大使用可能ユーザー数の見極め
パフォーマンスネックの洗い出し
高負荷状態での長時間耐久試験
想定最大ユーザー数でのキャパシティのテスト
レスポンスタイムが判定基準
1サーバーのみ or ネットワーク全体
取得情報と目標値
レスポンスタイム、CPU使用率、メモリ使用量、JVMヒープ、GCの頻
度・・・
6
パフォーマンスデータの取得
7
パフォーマンスデータの取得
パフォーマンスを判断するために、以下のような項目をパフォーマンス
データとして各サーバーで取得します。
1.
レスポンスタイムの取得
CPU使用率の確認
メモリ使用量の確認
アクセス数、TCPコネクションの確認
WASのモニタリングツールを用いたパフォーマンスデータの取得
2.
3.
4.
5.
JVMヒープ
スレッドプール
コネクションプール
セッション
その他、モニタリングツールで取得できる項目
(参考)パケットキャプチャー
8
1.レスポンスタイムの取得
各コンポーネントでレスポンスタイムを取得し、その差に注目。
レスポンスタイムの差から遅延部分を判断
IHSのレスポンスタイム
WASの要求メトリック
Webサーバーでの
遅延部分
プラグインでの
遅延部分
Webコンテナーでの
遅延部分
EJBコンテナーでの
遅延部分
DB処理での
遅延部分
access.log
Web
Server
plugin
Application
Server1
(WebContainer)
Application
Server2
(EJBContainer)
DB
http_plugin.log
SystemOut.log
(Server1)
SystemOut.log
(Server2)
SystemOut.log
(Server2)
9
Webサーバーのレスポンスタイム取得
レスポンスに時間がかかっているリクエストを判断
LogFormatディレクティブ
%D : レスポンスタイムをマイクロ秒単位で表示(IHS v2.0)
%T : レスポンスタイムを秒単位で表示(IHS v1.3、2.0)
デフォルトでは記載されないので、手動で追加する必要がある
レスポンスタイムをログに記録させる設定が必要。
httpd.conf
LogFormat “%h %l %u %t ¥”%r¥“ %>s %b [%D] ” common
access.log
9.170.251.57 - - [20/Oct/2005:14:18:31 +0900]
9.170.251.57 - - [20/Oct/2005:14:18:46 +0900]
9.170.251.57 - - [20/Oct/2005:14:18:46 +0900]
[31250]
9.170.251.57 - - [20/Oct/2005:14:18:52 +0900]
[5718750]
"GET /JVM/index.html HTTP/1.1" 404 61 [1234375]
"GET /JVM/input.html HTTP/1.1" 200 1494 [62500]
"GET /JVM/theme/Master.css HTTP/1.1" 200 731
"POST /JVM/TableViewer HTTP/1.1" 200 8924
アクセスログにレスポンスタイムが表記される
表計算ソフトなどを用いて、レスポンスの遅いリクエストを判断
10
WASの要求メトリック
どのコンポーネントの処理で遅延が発生しているかを判断
要求メトリックをONに設定、各コンポーネントのレスポンスタイムをログに出力させる
リクエスト全てに書き込みを行うと、要求メトリックによる出力自体が
パフォーマンスに影響を与える可能性があるので、
フィルターにより対象となるリクエストのみ出力させる
SystemOut.log
[05/10/20 14:19:07:266 JST] 00000030 PmiRmArmWrapp I PMRM0003I:
parent:ver=1,ip=9.170.251.57,time=1129785202984,pid=2720,reqid=1,event=1 current:ver=1,ip=9.170.251.57,time=1129785202984,pid=2720,reqid=2,event=1 type=JDBC
detail=SELECT * from staff elapsed=3125
[05/10/20 14:19:07:469 JST] 00000030 ServletWrappe A SRVE0242I: [JvmHandsOn] [/JVM]
[/output.jsp]: 初期化が正常に行われました。
[05/10/20 14:19:08:172 JST] 00000030 PmiRmArmWrapp I PMRM0003I:
parent:ver=1,ip=9.170.251.57,time=1129785472812,pid=2968,reqid=0,event=1 current:ver=1,ip=9.170.251.57,time=1129785202984,pid=2720,reqid=1,event=1 type=URI
detail=/JVM/TableViewer elapsed=14313
各コンポーネントのレスポンスタイムが記録されるので、その差に注目
差が大きいところに多くの時間を取られていることになる
11
要求メトリックの出力
出力は親(parent:呼び出し元)、子(current:呼び出された側)で構成。
リクエストの流れはリクエストIDを見て判断
elapsedがレスポンスタイムを示す
http_plugin.log
[Sun Aug 28 13:21:20 2005] 00000684 00001284 - PLUGIN:
parent:ver=1,ip=9.170.251.57,time=1125201907343,pid=1668,reqid=0,event=1 –
current:ver=1,ip=9.170.251.57,time=1125201907343,pid=1668,reqid=0,event=1 type=HTTP
detail=/JVM/TableViewer elapsed=23203 bytesIn=14 bytesOut=8871
reqid=0の子とreqid=0の親が結びつく
SystemOut.log
[05/08/28 13:21:06:375 JST] 00000034 PmiRmArmWrapp I PMRM0003I:
parent:ver=1,ip=9.170.251.57,time=1125202727641,pid=6048,reqid=1,event=1 –
current:ver=1,ip=9.170.251.57,time=1125202727641,pid=6048,reqid=2,event=1 type=JDBC
detail=SELECT * from staff elapsed=359
[05/08/28 13:21:19:953 JST] 00000034 PmiRmArmWrapp I PMRM0003I:
parent:ver=1,ip=9.170.251.57,time=1125201907343,pid=1668,reqid=0,event=1 –
current:ver=1,ip=9.170.251.57,time=1125202727641,pid=6048,reqid=1,event=1 type=URI
detail=/JVM/TableViewer elapsed=21765
elapsedがレスポンスタイム。
最も開きの大きいところに注目
同様にreqid=1の子とreqid=1の親が
結びつく
12
(参考)要求メトリックで出力される項目
フィールド
説明
parent
呼び出し側(親)の識別子
current
呼び出された側(子)の識別子
ver
親と子の相関関係のバージョン、親子の両者は同じ数字になります
ip
アプリケーション・サーバーがあるノードのIPアドレス
pid
アプリケーション・サーバーのプロセスID
time
アプリケーション・サーバーのプロセス開始時刻
reqid
要求メトリックがリクエストに割り当てるID
event
実際のトレースを区別するために割り当てられるイベントID
type
リクエストのタイプ
HTTP、URI、EJB、JDBC、JMS、非同期ビーン(COMMONJ_WORK_POOLED、
COMMONJ_TIMER)、Webサービスがサポート
detail
リクエストの詳細データで、URIのフルパス、SQLステートメント、EJBメソッド名など
elapsed
トータルの経過時間(ミリ秒)で、子の経過時間を全て含んだ時間
bytesIn
Webサーバー・プラグインが受け取ったリクエストのバイト数
bytesOut
Webサーバー・プラグインがクライアントに送信されたレスポンスのバイト数
13
要求メトリックの設定
管理コンソール左メニューの[モニターおよびチューニング]→[要求メトリック]
デフォルトはOFF
どのコンポーネントのデータを取得するかを設定
要求メトリックの使用の有無
(デフォルトはOFF)
フィルターの設定
フィルターをONにしたもののみ出力される
対象コンポーネントの指定
結果をログに出力させる
14
要求メトリックのフィルター
特定データのみを出力させる
フィルターを使用可能にしたデータのみをログに出力させることで、要求
メトリックの出力によるパフォーマンスダウンを抑える。
フィルターの種類を選択
/JVM/TableViewerというURIに対してフィルターをかけた例。
他のURIをアクセスしても要求メトリックの結果は出力されない
フィルターの値を入力
使用可能にする、を選択
15
ARM(Application Response Measurement)
レスポンスタイムを取得し、外部のシステム管理ツールに報
告するためのAPIを提供
Tivoli製品との連携
Tivoli Composite Application Manager for Response Time Tracking に要求メトリッ
クで取得した情報を送信
アプリケーションコードに測定の開始点と終了点を記述し、
その間のレスポンスタイムを取得
16
2.CPU使用率の確認
遅延が発生しているマシンに関してCPUの使用率を確認
vmstatコマンド(AIX、Linux)
CPUやメモリの使用状況の変化を一定時間間隔で表示
10秒間隔で利用状況をレポート
-tオプションで時刻を表示
vmstat -t 10 の出力(AIX)
#vmstat -t 10
kthr
memory
page
faults
cpu
------- -------------------- ------------------------ ----------------- --------------- ----------r b avm fre
re pi po fr sr cy in sy cs us sy id wa hr mi se
1 1 115652 95387 0 0 0 0 0 0 159 1693 127 1 3 95 1 14:18:24
1回目は起動時からの平均
0 0 115662 95377 0 0 0 0 0 0 153 1275 107 1 1 98 0 14:18:34
0 0 115660 95379 0 0 0 0 0 0 152 1819 107 1 3 96 0 14:18:44
2 0 115659 95380 0 0 0 0 0 0 162 2779 130 2 5 89 4 14:18:54
1 0 122849 88190 0 0 0 0 0 0 155 3968 104 83 6 10 0 14:19:04
1 0 133614 77425 0 0 0 0 0 0 155 7772 107 92 8 0 0 14:19:14
指定間隔で平均を取る 1 0 143252 67786 0 0 0 0 0 0 156 4619 114 92 7 0 0 14:19:24
1 0 146578 64460 0 0 0 0 0 0 155 2350 102 96 4 0 0 14:19:34
17
vmstatで取得できる内容
AIXとLinuxでは取得できる情報が一部異なる
AIX
-tオプションで時刻を表示。表示間隔と回数を指定
kthr:実行可能(r)、待機待ち(b)のカーネルスレッド数
メモリ:アクティブな仮想ページ(avm)、空きメモリページ(fre)
ページ:ページャーの入出力リスト(re)、ページイン数(pi)、ページアウト数(po)、フリーページ
数(fr)、ページ置換アルゴリズムによりスキャンされたページ数(sr)、クロックサイクル数(cy)、
フォルト:デバイスの割り込み数(in)、システムコールの数(sy)、コンテキスト切替数(cs)
CPU:ユーザモードのCPU使用率(us)、システムモードのCPU使用率(sy)、アイドル状態の
CPU使用割合(id)、ローカルディスク入出力が保留中のCPUの割合(wa)
Linux
表示間隔と回数を指定
Procs:実行待ち状態のプロセス数(r)、割り込み不可能なスリープ状態にあるプロセス数(b)、
Memory:使用されている仮想メモリ量(swpd)、空きメモリ量(free)、バッファとして使われてい
るメモリ量(buff)、ページキャッシュとして使われているメモリ量(cache)
Swap:ディスクからスワップインされたメモリ量(si)、ディスクにスワップアウトされたメモリ量
(so)
IO:ブロックデバイスに送られたブロック(bi)、ブロックデバイスから受け取ったブロック(bo)
System:毎秒での割り込み数(in)、毎秒のコンテキストスイッチ数(cs)
CPU:ユーザモードのCPU使用率(us)、システムモードのCPU使用率(sy)、アイドル状態の
CPU使用割合(id)、入出力が待機中のCPUの割合(wa)
18
CPUネックの時の挙動
kthr(カーネルスレッド)とCPU(CPU使用率)に注目
r :実行可能なカーネルスレッド。実行中のスレッド+CPU 待ちのスレッド
b:待機キュー内のカーネルスレッド。入出力待ちのスレッド。
us:ユーザーモードで使用されたCPU時間の割合。プロセスはそのアプリケー
ションコード内部で実行。
sy:システムモードで使用されたCPU時間の割合。カーネルプロセスおよび
カーネルリソースへのアクセスが必要な他のプロセスによって消費されたCPU。
id:CPUが入出力の保留せずにアイドル状態になっている時間の割合
wa:ローカルディスクおよびNFSマウントのディスクの入出力が保留中で、
CPUがアイドルだった時間の割合
vmstat 2 の出力(AIX)
# vmstat 2
kthr
memory
----- ---------------r b avm fre
1 0 22478 1677
1 0 22506 1609
0 0 22498 1582
2 0 22534 1465
2 0 22534 1445
2 0 22534 1426
3 0 22534 1410
2 1 22557 1365
page
faults
cpu
------------------------- ----------------- --------------re pi po fr sr cy in sy cs us sy id wa
0 0 0 0 0 0 188 1380 157 57 32 0 10
0 0 0 0 0 0 214 1476 186 48 37 0 16
0 0 0 0 0 0 248 1470 226 55 36 0 9
0 0 0 0 0 0 238 903 239 77 23 0 0
0 0 0 0 0 0 209 1142 205 72 28 0 0
0 0 0 0 0 0 189 1220 212 74 26 0 0
0 0 0 0 0 0 255 1704 268 70 30 0 0
0 0 0 0 0 0 383 977 216 72 28 0 0
実行キューの数がCPUの数より多いときは、
CPU待ちのスレッドが存在している。
CPU待ちのスレッドが多くなると、
パフォーマンスへの影響も大きくなる
us+syの割合が100%になっている。
us+syの時間が80%を超えると、
プロセスが実行キューで待っている間に
時間を費やしてしまう可能性がある。
waが25%を超えている場合は、
ディスクの入出力が過多になっている
( →iostatコマンドなどによる確認)
(参考)AIX InfoCenter:パフォーマンスマネージメントガイド –CPUパフォーマンスモニター
http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/aixbman/prftungd/cpuperf.htm
19
(参考)複数CPUマシンの各CPU使用率の確認
sarコマンドを用いると各CPUごとの使用率を確認できる
sar –P ALL 2 3 の出力(AIX)
# sar -P ALL 2 3
AIX aixsmphost 2 5 00049FDF4D01
17:30:50 cpu
17:30:52 0
1
2
3
17:30:54 0
1
2
3
17:30:56 0
1
2
3
Average
0
1
2
3
-
02/22/04
%usr %sys %wio %idle
8
92
0
0
0
4
0
96
0
1
0
99
0
0
0 100
2
24
0
74
12 88
0
0
0
3
0
97
0
1
0
99
0
0
0 100
3
23
0
74
11 89
0
0
0
3
0
97
0
0
0 100
0
0
0 100
3
23
0
74
10
0
0
0
3
90
4
1
0
24
0
0
0
0
0
0
96
99
100
74
各CPUごとの使用率
上記4CPUの平均
vmstatで表示されるのは4CPUの平均になる
kthr
memory
page
faults
cpu
------- ------------------- -------------------------- --------------------- --------------r b avm fre
re pi po fr sr cy in
sy cs us sy id wa
1 1 255733 15930 0 0 0 0 0 0 476 49437 27 2 24 74 0
1 1 255733 15930 0 0 0 0 0 0 473 48923 31 3 23 74 0
1 1 255733 15930 0 0 0 0 0 0 466 49383 27 3 23 74 0
表示回数を指定すると、
最後に各CPUの平均を表示
20
3.メモリ使用量の確認
vmstatコマンド
メモリネック時の挙動
memory(メモリの使用量)、page(ページング)に注目
avm:vmstatサンプルが収集された時点でアクティブ
であった仮想メモリ・ページ数(1ページ=4kB)
pi:ページング・スペースからページインされるページの数。ページング・
fre:空きメモリ・ページの平均数
スペースは仮想メモリの一部で、ディスクに常駐している部分。
po:ページング・スペースにページアウトされるページの数
vmstat 2 の出力(AIX)
# vmstat 2
kthr
memory
page
faults
cpu
-------- ----------------- ---------------------------- ------------------ ----------------r b
avm fre re pi po fr sr cy in
sy cs us sy id wa
0 3 113659 135 0 2 2 108 323 0 516 1563 797 25 7 2 66
0 2 113661 122 0 3 2 120 375 0 527 1622 871 13 7 2 79
0 3 113662 128 0 10 3 134 432 0 644 1434 948 22 7 4 67
1 5 113858 238 0 35 1 146 422 0 599 5103 903 40 16 0 44
0 3 113969 127 0 5 10 153 529 0 565 2006 823 19 8 3 70
0 3 113983 125 0 33 5 153 424 0 559 2165 921 25 8 4 63
0 3 113682 121 0 20 9 154 470 0 608 1569 1007 15 8 0 77
0 4 113701 124 0 3 29 228 635 0 674 1730 1086 18 9 0 73
pi、poが常にゼロ以外の場合は、
メモリのボトルネックが存在する可能性
ページインやページアウトが多発すると、
入出力待ちが多くなる
(参考)AIX InfoCenter:パフォーマンスマネージメントガイド –メモリー・パフォーマンス
http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/aixbman/prftungd/memperf.htm
21
メモリ使用量の確認
svmonコマンド(AIX Only)
Pid(プロセスID)、Command(コマンド)、Inuse(実メモリ内のページ数)、Pin
(ページアウトされないページ数)、Pgsp(ページングスペースのページ数)、
Virtual(仮想アドレスのページ数)、64-bit(プロセスが64ビットか否か)、
Mthrd(マルチスレッドか否か)、Lpage(大規模ページがあるか否か)
4KB単位で表記される。
プロセスIDを指定
svmon –P <process id> の出力(AIX)
使用しているメモリの情報
(4KB/ページ)
# svmon -P 22556
------------------------------------------------------------------------------Pid Command
Inuse
Pin Pgsp Virtual 64-bit Mthrd LPage
22556 java
61244 4065
0 50404
N
Y
N
Vsid
21010
3affd
32019
0
3c5de
Esid Type Description
LPage Inuse Pin Pgsp Virtual
4 work working storage
- 19718 0
0 19718
3 work working storage
- 12247 0
0 12247
d work text or shared-lib code seg
- 11985 0
0 11985
0 work kernel seg
- 6052 3998 0 6052
- pers /dev/hd2:315563
- 1389 0
-
22
(参考)Windowsのパフォーマンスモニター
perfmon
システムモニタ
メモリやプロセッサ、ネットワークなどの利用状況のリアルタイムデータを収集
グラフやヒストグラム、レポート形式で表示
パフォーマンスログと警告
データを記録するためのログを構成
閾値による警告の設定
メモリやプロセッサの利用状況を
リアルタイムで表示
「パフォーマンスと警告」のカウンタログ
CSV形式で記録し、表計算ソフトで開くことも可能
23
4.アクセス数の確認
システムの前段にあるWebサーバーのアクセスログを確認
アクセスログからシステムのスループットを算出
IHSのアクセスログの時間表示はリクエストを受けた時間を指す
リクエストを受けた時間
access.log
9.170.251.57 - - [14/Nov/2005:15:19:07 +0900] "GET /Sample/sleep HTTP/1.1" 503 424
9.170.251.98 - - [14/Nov/2005:15:18:57 +0900] "GET /Sample/sleep HTTP/1.1" 200 417
9.188.52.31 - - [14/Nov/2005:15:19:01 +0900] "GET /Sample/sleep HTTP/1.1" 200 417
9.170.251.57 - - [14/Nov/2005:15:19:04 +0900] "GET /Sample/sleep HTTP/1.1" 200 417
9.170.251.98 - - [14/Nov/2005:17:27:17 +0900] "GET /JVM/input.html HTTP/1.1" 200 1494
9.170.251.98 - - [14/Nov/2005:17:27:18 +0900] "GET /JVM/theme/Master.css HTTP/1.1" 200 731
9.170.251.98 - - [14/Nov/2005:17:28:51 +0900] "GET /JVM/input.html HTTP/1.1" 200 1494
9.170.251.98 - - [14/Nov/2005:17:28:51 +0900] "GET /JVM/theme/Master.css HTTP/1.1" 200 731
9.170.251.98 - - [14/Nov/2005:17:30:13 +0900] "GET /JVM/input.html HTTP/1.1" 200 1494
9.170.251.98 - - [14/Nov/2005:17:30:13 +0900] "GET /JVM/theme/Master.css HTTP/1.1" 200 731
9.170.251.98 - - [14/Nov/2005:17:30:46 +0900] "GET /JVM/input.html HTTP/1.1" 304 9.170.251.98 - - [14/Nov/2005:17:30:46 +0900] "GET /JVM/theme/Master.css HTTP/1.1"
IHSのアクセスログから処理したリクエスト数を時間間隔で割ると、
スループット(アクセス件数/秒)が計算できる
24
TCPコネクションの確認
TCPコネクション数や接続ステータスの確認。
netstatコマンド
netstat –an
a:ESTABLISHED以外の接続も表示
n:出力を数字のみに抑制(IPアドレスやサービスの逆引きを行わない)
実際にはgrepコマンドと併用して、注目するポート番号のみを表示させる
netstat -an の出力の一部(AIX)
左からプロトコル、受信バッファで溜まっているバイト数、
送信バッファで溜まっているバイト数,
接続元のアドレスとポート番号、
接続先のアドレスとポート番号、ステータスを示す。
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
tcp
0
0
*.80
*.*
tcp4
0
0
*.111
*.*
tcp4
0
0
*.199
*.*
tcp
0
0
*.443
*.*
tcp
0
0
*.512
*.*
・・・・・
tcp
0
0
*.9080
*.*
tcp
0
0
*.9443
*.*
ステータスがLISTEN=外部からの接続待ち状態。
(state)
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
IHSでListenしているポート番号
WASのアプリケーションサーバーが持つ
HTTPトランスポートがListenされている
(管理コンソールからアプリケーション
サーバーを選択し、 [Webコンテナー]→
[Webコンテナー・トランスポート・チェー
ン] )
25
(参考)接続のステータス
接続を
受け入れられる状態
クライアントが接続要求を出す。
ステータスSYN_SENTに
SYN_SENT
SYN
SYN|ACK
ACK
ESTABLISHED
リクエストのやり
リクエストのやり取
のやり取り
FIN | ACK
ACK
LAST_ACK
接続要求に対して返事。
ステータスがSYN_RCVDに
SYN_RCVD
ESTABLISHED
接続の切断要求を出す。
ステータスがFIN_WAIT1に
FIN_WAIT1
切断要求受信確認。
相手からのFINを待つ。
ステータスがFIN_WAIT2に
CLOSE_WAIT
接続の切断要求を出す。
ステータスLAST_ACKに
LISTEN
FIN | ACK
FIN_WAIT2
ACK
TIME_WAIT
26
TCPコネクションの確認
指定したポートに対しESTABLISHEDになってるものが、現在クライアントとサー
バー間で生成された接続の数
ポートに対して有効な接続数を表示させるコマンドの例
netstat –an | grep “¥.<Port番号>” | grep ESTABLISHED | wc –l
クライアント-Webサーバー間の接続数
netstat –an の出力(AIX)
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
tcp
0
0
*.80
*.*
tcp4
0
0 9.188.52.38.80
9.170.251.98.3034
tcp4
0
0 9.188.52.38.80
9.170.251.98.3035
tcp4
0
0 9.188.52.38.80
9.170.251.98.3036
tcp4
0
0 9.188.52.38.80
9.170.251.98.3037
tcp4
0
0 9.188.52.38.80
9.170.251.98.3038
(state)
LISTEN
ESTABLISHED
ESTABLISHED
ESTABLISHED
ESTABLISHED
ESTABLISHED
Webサーバー-アプリケーションサーバー間の接続数
netstat -anの出力(AIX)
Active Internet connections (including servers)
Proto Recv-Q Send-Q
Local Address
Foreign Address
tcp
0
0
*.9080
*.*
tcp4
0
0 9.188.52.71.9080
9.188.52.38.37780
tcp4
0
0 9.188.52.71.9080
9.188.52.38.37781
IPアドレス9.170.251.98から
IHSの80番ポートに対し
5本のリクエストを処理中。
IPアドレス9.188.52.38(IHS)から
9080番(HTTPトランスポート)に対し
2本のリクエストを処理中。
(state)
LISTEN
ESTABLISHED
ESTABLISHED
27
5.TivoliPerformanceViewerを用いたモニタリング
JVMヒープ
スレッドプール
コネクションプール
セッション
TPVで取得可能な情報の一覧
28
Tivoli Performance Viewer
WASのモニタリングツール
リアルタイムでデータを表示。ログの取得、再生も可能
V6からは管理コンソールに統合
[モニターおよびチューニング]→[Performance Viewer]
右側に取得値がグラフで表示
(表にすることも可能)
対象サーバーを選択して、
[モニターの開始]を押す
モニターする項目を選んで
[モジュールの表示]
29
PMI (Performance Monitoring Infrastructure)
WASのコンポーネントのデータをモニターするインターフェイス
TPVはPMIを介してパフォーマンスデータを取得、表示
JVMヒープ使用率、JDBC接続プール内
のオブジェクト数、スレッドプール内のスレッド数、
セッション作成数・・・・などの情報
WebServer
WebServer
TPV
PMIを介してデータを取得、表示
PMI
Application
Application
Server
Server
(WebContainer)
(WebContainer)
Application
Application
Server
Server
(EJBContainer)
(EJBContainer)
DB
V6からデフォルトで使用可能に
PMIで取得する情報のレベル
(統計セット)を「基本」、「拡張」、
「すべて」、「カスタム」から選択
「+」をクリックすると、そのレベルで
取得できる情報の一覧が表示される
30
JVMヒープのモニタリング
「JVMランタイム」カテゴリ
JVMについてのデータを取得
4つのサブカテゴリの表示には、JVM始動時にJVMPIをONにしておく必要
汎用JVM関数に –XrunpmiJvmpiProfiler を指定
カウンター
レベル
説明
FreeMemory
拡張
JVMランタイムの空きメモリ(kB)
HeapSize
基本
JVMランタイムの合計メモリ(kB)
UpTime
基本
JVMの実行時間(秒)
UsedMemory
基本
JVMランタイムの使用メモリ(kB)
GCCount
全て
GCの呼び出し回数
GCIntervalTime
全て
2つのGC呼び出し間の平均時間(ミリ秒)
GCTime
全て
GCの平均所要時間(ミリ秒)
ObjectAllocateCount
全て
ヒープに割り振られたオブジェクトの数
ObjectFreedCount
全て
ヒープ内から開放されたオブジェクトの数
ObjectMovedCount
全て
ヒープ内で移動されたオブジェクトの数
ThreadEndedCount
全て
終了したスレッドの数
ThreadStartedCount
全て
開始したスレッドの数
WaitForLockTime
全て
スレッドがロック待ちする平均時間
WaitsForLockCount
全て
スレッドがロック待ちする回数
JVMランタイム
ガーベッジコレクション
オブジェクト
スレッド
モニター
31
JVMヒープの分析
JVMランタイム
使用メモリ、空きメモリ、合
計メモリを確認
GCによりメモリが大きく開放
される場合は最大ヒープサ
イズを小さくする
GCの開放量は85%以内が望
ましい。
ガーベッジコレクション
GCの回数、呼び出し間隔、
所要時間を確認
GCの平均所要時間%=
(GC平均所要時間)/(GCの
平均所要時間+GC呼び出
し平均間隔)×100が15%未
満になるのが望ましい
TPVでの確認にはJVMPIの
設定が必要
合計メモリは一定
使用メモリが大きく減っている点がGCの発生。
例では1回のGCにより、約50%程度空きを確保し、
時間間隔もほぼ一定。
GC呼び出し間隔は増加し、GC所要時間は減少傾向。
GC平均所要時間%は減少にある。例では1.31%。
JVMPIの使用はパフォーマンスに影響を与える可能性がある
GC発生
32
verbose:gc
ガーベッジコレクションの実行状況を記録
native_stderr.logに出力
GCの頻度、GCによるオブジェクトのCompaction、ヒープの拡張、収縮などの情報を取得
汎用JVM引数に -Xverbosegclog:<path>/<filename> を指定して変更
デフォルトではOFF。管理コンソール上で設定の必要
冗長ガーベッジ・コレクションにチェック or –verbose:gc
verbose:GCを解析するためのツールも存在
( → 4章「Webシステムにおけるチューニング項目」の「JVMヒープのチューニング」 p.92)
GC発生時のverbose:gc
native_stderr.log
GCの発生回数
前回のGCからの所要時間
<AF[7]: Allocation Failure. need 720 bytes, 5087 ms since last AF>
<AF[7]: managing allocation failure, action=1 (0/50330176) (2097088/2097088) >
<GC(7): GC cycle started Wed Aug 24 18:35:02 2005
<GC(7): 18641632 bytes, 39% free (20738720/52427264), in 219 ms >
<GC(7): mark: 195 ms, sweep: 24 ms, compact: 0 ms >
<GC(7): refs: soft 0 (age >= 32), weak 10, final 224, phantom 1 >
<AF[7]: completed in 232 ms>
GCの所要時間
オブジェクトのCompactionが発生すると、以下のメッセージが書き込まれる
<GC(22): moved 336139 objects, 19365984 bytes, reason=14, used 11592 more bytes>
さらにヒープの拡張が発生すると、以下のメッセージが書き込まれる
<GC(32): expanded heap by 17563648 to 117635584 bytes, 33% free>
33
(参考)verbose:gcの出力
GC発生時のverbose:gcの出力内容
Compaction発生時に追加される内容
1行目 :AFがAllocation Failureの発生、[ ]内の数字がJVM起動後にAFが発生した回数を示して
います。need 720byteがAllocationに必要な容量、5087ms since last AFが前回のAllocation
Failureからの経過時間を示しています。上記の例では、5087ms後に今回(7回目)のAllocation
Failureが発生したことを示しています。
2行目 :action=0は実行されたアクションを0から6までの数字で示したものです。上記の例の1は
Wilderness(巨大オブジェクト用の保管領域)の使用を避けるためにGCを実行したことを示していま
す。()内の数字は(空き容量/Heap領域) を示しています。
3行目 :GCが開始した時刻を示しています。
4行目 :GCの結果、開放された容量とその割合、所要時間を示しています。例では18641632byte
が開放され、空き領域は全体の39%、20738720/52427264byteになったことを示し、その作業に
219msかかったことになります。
5行目 :このGCのmarkフェーズ(オブジェクトのマーキング)、sweepフェーズ(不要オブジェクトの
開放)、compact(空き領域の整理)の所要時間を示しています。上記の例ではcompactの作業は
行っていません。
6行目 :GCの間に見つかったオブジェクトの数を示しています。
7行目 :Allocation Failure発生後からの経過時間を示しています。
Compactionによって移動したオブジェクトの数とサイズ、Compactionの理由、増加された容量を示
しています。以上の例では、336139個、計19365984byteのオブジェクトを移動させた結果、さらに
11592byteの領域が確保できたことを示しています。
ヒープが拡張した時に追加される内容
17563648byteの領域が拡張され、全体として領域が117635584byte(空き領域は33%)になったこ
とを示しています。
34
HeapDump
テストを実施したときに、アプリケーションサーバーのJVMヒープが圧迫されてい
ることが判断できた際に、JVMヒープ上の全てのオブジェクトの情報を見るために
出力する
JVMの作業ディレクトリ(変数で出力先の指定があればそのディレクトリ)にPHD
形式で以下のファイル名で出力
heapdump.YYYYMMDD.HHMMSS.<process_ id>.phd (Windows)
heapdump<process id>.<CPU_TIME>.phd (AIX、Linux)
テキストファイルで出力させるには環境変数IBM_JAVA_HEAPDUMP_TEXTの設定が必
要
ヒープを使い切ったとき以外で取得するには、環境変数IBM_HEAPDUMPをtrue
に設定。
wsadminを用いた手動によるHeapDumpの出力
wsadmin> set obj [$AdminControl queryNames WebSphere:type=JVM,process=server1,*]
wsadmin> $AdminControl invoke $obj generateHeapDump
オブジェクトのアドレス、サイズ、名前と参照されているオブジェクトアドレスをリス
トで表示
HeapDumpの解析には解析ツールが必要
( → 4章「Webシステムにおけるチューニング項目」の「JVMヒープのチューニン
グ」 p.93)
35
JVMヒープのチューニング
GCから適切なJVMヒープサイズを判断
ヒープ領域が拡張と収縮を繰り返すことなく、定常
GC終了後に30%以上の空き領域を常に確保
チューニングの例
ヒープ領域が定常状態になるまでにGCが頻発
ヒープ領域がすぐに最大ヒープサイズとなり、GC終了後の空きが
30%確保できていない
最大ヒープサイズが小さいので、GC終了後に空き領域が30%確保できるように
大きくする
GCの平均所要時間%が15%以上と、発生頻度が高い
初期ヒープサイズが小さいので、定常となった値を初期ヒープサイズと設定
GC実施後、空き領域が-Xminf(デフォルト0.3)で指定された領域を確保できない
と、ヒープは拡張される
GC後に大きい空き領域を確保するため、-Xminfを大きくする
1回のGCの開放量が85%と大きく、所要時間が長い
初期ヒープサイズが大きいので、ヒープサイズを小さくする
36
スレッドプールのモニタリング
「スレッドプール」カテゴリ
WASの各スレッドプールのデータを取得
カウンター
レベル
説明
ActiveCount
拡張
同時にアクティブなスレッド数
ActiveTime
全て
スレッドがアクティブ状態の平均時間(ミリ秒)
CleardThreadHangCount
全て
クリアされたハングスレッドの数
ConcurrentHungThreadCount
全て
停止されたハングスレッドの数
CreateCount
全て
作成されたスレッドの総数
DeclaredThreadHungCount
全て
停止宣言されたハングスレッドの数
DestoryCount
全て
破棄されたスレッドの総数
PercentMaxed
全て
全てのスレッドが使用中である時間の平均比率
PoolSize
基本
プール内の平均スレッド数
スレッド・プール
37
Webコンテナースレッドの分析
すべてのスレッドが使用中である状態が続くようであれば、スレッドの最
大サイズの増加かスレッド数の制御を検討
プールサイズ、アクティブスレッド数、全てのスレッドが使用中である時間の
比率を確認
全てのスレッドが使用中
プールサイズが最大スレッド数に達しており、
その全てがアクティブになっている
38
コネクションプールのモニタリング
「JDBC接続プール」カテゴリ
コネクションプールの情報を取得
カウンター
レベル
説明
AllocateCount
全て
割り振られた接続の総数
CloseCount
基本
プールから破棄された接続の総数
ConnectionHandleCount
全て
特定の接続プールで使用されている接続オブジェクト(接続
ハンドル)の総数(v5.0データソースのみ)
CreateCount
基本
作成された接続の総数
FaultCount
拡張
プールにある接続タイムアウトの数
FreePoolSize
基本
プールにある空き接続の数
JDBCTime
拡張
JDBC呼び出しの実行にかかる平均時間(ミリ秒・v5.0デー
タソースのみ)
ManagedConnectionCount
全て
特定の接続プールで使用されているManagedConnectionオ
ブジェクト(物理接続)の数(v5.0データソースのみ)
PercentMaxed
全て
全ての接続が使用中である時間の平均比率
PercentUsed
基本
使用中のプールの平均比率
PoolSize
基本
接続プールのサイズ
PrepStmtCacheDiscardCount
拡張
破棄されたPrepaerdStatementの数
ReturnCount
全て
プールに戻された接続の総数
UseTime
基本
接続が割り振られてから戻されるまでの平均時間(ミリ秒)
WaitTime
基本
接続が割り振られるまでの平均待ち時間(ミリ秒)
WaitingThreadCount
基本
同時に接続待ちをするスレッドの平均数
JDBC接続プール
39
コネクションプールのチューニング
チューニングの例
「PercentMaxed」が100%の状態が続き、「WaitThreadCount」が多い
「FaultCount」の値が多い
接続タイムアウトによってエラーとなったリクエスト数が多く、接続タイムアウト値を
大きくするか、コネクションプールの最大接続数を大きくする
「ManagedConnectionCount」の変動が多い
コネクションプール内のコネクションオブジェクトが不足し、接続待ちが多いので、
最大接続数を大きくする
物理接続の作成と破棄が繰り返されており、未使用タイムアウト値、または最小
接続数を大きくする
「PrepStmtCacheDiscardCount」が多い
PreparedStatementキャッシュが廃棄されており、ステートメント・キャッシュ・サイ
ズが不足しているので大きくする
40
セッションのモニタリング
「サーブレット・セッション・マネージャー」カテゴリ
セッションの情報を取得
カウンター
レベル
説明
ActivateNonExistSessionCount
全て
セッションタイムアウトとなり存在しないセッションに対す
るリクエスト数
ActiveCount
全て
リクエストにより現在アクセスしているセッションの総数
AffinityBreakCount
全て
中段されたセッションアフィニティの数
CacheDiscardCount
全て
分散セッションでキャッシュから破棄されたセッションの数
CreateCount
全て
作成されたセッションの数
ExternalReadSize
拡張
外部から読み取られたセッションのサイズ
ExternalReadTime
拡張
外部からのセッションの読み取りにかかる時間(ミリ秒)
ExternalWriteSize
拡張
外部に書き込んだセッションのサイズ
ExternalWriteTime
拡張
外部へのセッションの書き込みにかかる時間(ミリ秒)
InvalidateCount
全て
無効化されたセッションの数
LifeTime
全て
平均セッション持続時間(ミリ秒)
LiveCount
基本
現在活動中のセッションの数
NoRoomForNewSessionCount
全て
「オーバーフローの許可」にチェックされていない時に適用。
最大セッション数を越えたため、新規セッションリクエスト
を処理できない数
SessionObjectSize
全て
セッションオブジェクトのサイズ
TimeSinceLastActicvated
全て
直前のアクセス時刻と現在の時刻の差(ミリ秒)
TimeoutInvalidationCount
全て
タイムアウトで無効になったセッションの数
サーブレット・セッション・マネージャー
41
セッションのチューニング
チューニングの例
「LiveCount」が非常に大きく、長時間と
どまっている場合は、セッションオブジェ
クトがヒープに残り続けているので、
「ActiveCount」との差が大きいのであれ
ば、セッションタイムアウト値を小さくす
る
「NoRoomForNewSessionCount」がカウ
ントされている場合、無効なセッションが
作成されている。メモリ内の最大セッショ
ンカウント値を大きくする
分散セッションで、
「CacheDiscardCount」がカウントされて
いる場合、セッションのスペース不足に
より、セッションオブジェクトが破棄が発
生。最大セッションカウント値を大きくす
る
「ActivateNonExistSessionCount」がカ
ウントされている場合、タイムアウトによ
り無効化されたセッションへのアクセス
が起こっているので、セッションタイムア
ウト値を大きくする
ActiveCountに比べ、
LiveCountの差が大きい例。
(アクセスのないセッションが多く残る)
セッションオブジェクトの
破棄が発生した例
42
TPVで取得可能な情報の一覧
「カスタム」画面から取得可能なデータの説明を見ることが可能
カテゴリ
取得情報
EnterpriseBean
応答時間やライフサイクルのアクティビティ、Enterprise BeanメソッドおよびEnterprise Beanによって使用される
リモートインターフェースの情報
JDBC接続プール
新規に作成された接続数など、データソースの接続プールについての使用情報
JCA接続プール
JCAについての使用情報
JVMランタイム
使用メモリなどJVMに関する情報
サーブレットセッションマネージャ
アクティブなセッションの平均数など、HTTP セッションの使用状況
スレッドプール
オブジェクトリクエストブローカー (ORB) スレッドのスレッドプール、HTTP要求を処理するWebコンテナープール
についての情報
トランザクションマネージャー
アクティブ・トランザクションの平均数など、トランザクションマネージャーのパフォーマンス情報
Webアプリケーション
ロードされたサーブレットの数、サーブレット要求の応答時間など、選択されたサーバーの情報
ORB
オブジェクト参照ルックアップ時間などORBに関する情報
ワークロード管理
IIOP要求の数など、クライアントとサーバーのワークロード管理に間する情報
動的キャッシング
メモリ内のキャッシュサイズなど、動的キャッシュサービスに関する情報
Webサービス
ロードされたWebサービスの数など、Webサービスに関する情報
Webサービスゲートウェイ
同期要求の数など、Webサービスゲートウェイに関する情報
システムデータ
CPU使用率など、マシン(ノード)に関する情報(複数のサーバー・バージョンのノード・エージェントでのみ使用可
能)
Alarm マネージャー
アラームに関する情報
オブジェクトプール
オブジェクトプールに関する情報
スケジューラー
スケジューラーサービスに関する情報
HA マネージャー
HAマネージャーに関する情報
DCS統計
DCSスタックを使用した送信メッセージ数など、DCSに関する情報
SIBサービス
SIBサービスに関する情報
43
(参考)基本レベルで取得できる情報一覧
Enterprise Bean.MethodReadyCount
Enterprise Bean.PassiveCount
Enterprise Bean.ReadyCount
Enterprise Bean.CreateCount
Enterprise Bean.MessageCount
Enterprise Bean.MethodCallCount
Enterprise Bean.MethodResponseTime
Enterprise Bean.RemoveCount
Enterprise Bean.PooledCount
JDBC 接続プール.WaitingThreadCount
JDBC 接続プール.UseTime
JDBC 接続プール.CloseCount
JDBC 接続プール.WaitTime
JDBC 接続プール.PercentUsed
JDBC 接続プール.FreePoolSize
JDBC 接続プール.CreateCount
JDBC 接続プール.PoolSize
JVM ランタイム.UpTime
JVM ランタイム.HeapSize
JVM ランタイム.UsedMemory
JCA 接続プール.WaitingThreadCount
JCA 接続プール.UseTime
JCA 接続プール.CloseCount
JCA 接続プール.WaitTime
JCA 接続プール.FreePoolSize
JCA 接続プール.CreateCount
JCA 接続プール.PoolSize
サーブレット・セッション・マネージャー.LiveCount
システム・データ.CPUUsageSinceLastMeasurement
スレッド・プール.PoolSize
トランザクション・マネージャー.ActiveCount
トランザクション・マネージャー.RolledbackCount
トランザクション・マネージャー.CommittedCount
Web アプリケーション.ServiceTime
Web アプリケーション.RequestCount
44
(参考)拡張レベルで取得できる情報一覧
Enterprise Bean.MethodReadyCount
Enterprise Bean.ReturnsDiscardCount
Enterprise Bean.PassiveCount
Enterprise Bean.ReadyCount
Enterprise Bean.ReturnsToPoolCount
Enterprise Bean.CreateCount
Enterprise Bean.MessageCount
Enterprise Bean.MethodCallCount
Enterprise Bean.MethodResponseTime
Enterprise Bean.RemoveCount
Enterprise Bean.PooledCount
Enterprise Bean.LiveCount
テンプレート.HitsInMemoryCount
テンプレート.MissCount
JDBC 接続プール.FaultCount
JDBC 接続プール.WaitingThreadCount
JDBC 接続プール.UseTime
JDBC 接続プール.JDBCTime
JDBC 接続プール.CloseCount
JDBC 接続プール.WaitTime
JDBC 接続プール.PercentUsed
JDBC 接続プール.PrepStmtCacheDiscardCount
JDBC 接続プール.FreePoolSize
JDBC 接続プール.CreateCount
JDBC 接続プール.PoolSize
JVM ランタイム.FreeMemory
JVM ランタイム.UpTime
JVM ランタイム.HeapSize
JVM ランタイム.UsedMemory
JCA 接続プール.WaitingThreadCount
JCA 接続プール.UseTime
JCA 接続プール.CloseCount
JCA 接続プール.WaitTime
JCA 接続プール.FreePoolSize
JCA 接続プール.CreateCount
JCA 接続プール.PoolSize
サーブレット・セッション・マネージャー.LifeTime
サーブレット・セッション・マネー
ジャー.NoRoomForNewSessionCount
サーブレット・セッション・マネージャー.ExternalReadSize
サーブレット・セッション・マネージャー.LiveCount
サーブレット・セッション・マネージャー.ExternalWriteTime
サーブレット・セッション・マネージャー.ExternalWriteSize
サーブレット・セッション・マネージャー.ExternalReadTime
システム・データ.CPUUsageSinceServerStarted
システム・データ.CPUUsageSinceLastMeasurement
スレッド・プール.PoolSize
スレッド・プール.ActiveCount
トランザクション・マネージャー.ActiveCount
トランザクション・マネージャー.LocalTimeoutCount
トランザクション・マネージャー.RolledbackCount
トランザクション・マネージャー.GlobalTimeoutCount
トランザクション・マネージャー.LocalBegunCount
トランザクション・マネージャー.LocalTranTime
トランザクション・マネージャー.GlobalTranTime
トランザクション・マネージャー.GlobalBegunCount
トランザクション・マネージャー.CommittedCount
Web アプリケーション.ServiceTime
Web アプリケーション.RequestCount
Web アプリケーション.ErrorCount
Web アプリケーション.ConcurrentRequests
サーバー.ServerResponseTime
サーバー.IIOPRequestCount
サーバー.ConcurrentRequestCount
45
(参考)パケットキャプチャー
パケットキャプチャーが必要なとき
HTTPヘッダーの確認
KeepAlive接続の確認
TCP/IPチューニングの実施後の確認
iptraceコマンド(AIX Only)
ネットワークを流れるパケットをキャプチャーするコマンド
iptraceコマンドでキャプチャを開始し、killコマンドで停止
ipreportコマンドによりフォーマット
iptraceの一例
ipreportの一例
-a : ARPパケットを除く
-b : 双方向のパケットを記録
-d : パケット送信先を指定
-s : パケット受信元を指定
-p : ポート番号を指定
-n : パケット出力の先頭にパケット番号を記載
-s : 各行先頭にプロトコルを記載
AIX以外では、ethereal(フリーソフト)などを用いてキャプチャーを実施
46
(参考)iptrace
(iptraceコマンド実行)
#iptrace -ab -d 9.188.52.71 -s 9.170.251.98 -p 80 /tmp/trace/itrace
(プロセス番号確認)
#ps -ef | grep iptrace
root 38242 1 0 18:28:43
- 0:00 iptrace -ab -d 9.188.52.71 -s 9.170.251.98 -p 80 /tmp/trace/itrace
root 43666 42878 0 18:28:59 pts/4 0:00 grep iptrace
(キャプチャ終了したら、iptraceのプロセス番号をkill)
ipreportの内容
#kill -9 38242
Packet Number 4
ETH: ====( 406 bytes received on interface en0 )====18:29:26.547582540
(ipreportでフォーマット)
ETH: [ 00:0e:38:91:a2:41 -> 00:09:6b:2e:93:5d ] type 800 (IP)
#ipreport -ns /tmp/trace/itrace > /tmp/trace/ireport
IP: < SRC = 9.170.251.98 >
パケットの受信元と送信先
受信元と送信先のポート番号
IP: < DST = 9.188.52.71 > (silver2)
IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=392, ip_id=58485, ip_off=0 DF
IP: ip_ttl=124, ip_sum=d5ea, ip_p = 6 (TCP)
TCP: <source port=4614, destination port=80(http) >
TCP: th_seq=9219e724, th_ack=698ffbb7
TCP: th_off=5, flags<PUSH | ACK>
TCP: th_win=32120, th_sum=9545, th_urp=0
TCP: 00000000 47455420 2f204854 54502f31 2e310d0a |GET / HTTP/1.1..|
TCP: 00000010 41636365 70743a20 696d6167 652f6769 |Accept: image/gi|
TCP: 00000020 662c2069 6d616765 2f782d78 6269746d |f, image/x-xbitm|
TCP: 00000030 61702c20 696d6167 652f6a70 65672c20 |ap, image/jpeg, |
TCP: 00000040 696d6167 652f706a 7065672c 20617070 |image/pjpeg, app|
TCP: 00000050 6c696361 74696f6e 2f766e64 2e6d732d |lication/vnd.ms-|
TCP: 00000060 65786365 6c2c2061 70706c69 63617469 |excel, applicati|
TCP: 00000070 6f6e2f76 6e642e6d 732d706f 77657270 |on/vnd.ms-powerp|
TCP: 00000080 6f696e74 2c206170 706c6963 6174696f |oint, applicatio|
TCP: 00000090 6e2f6d73 776f7264 2c206170 706c6963 |n/msword, applic|
TCP: 000000a0 6174696f 6e2f782d 73686f63 6b776176 |ation/x-shockwav|
TCP: 000000b0 652d666c 6173682c 202a2f2a 0d0a4163 |e-flash, */*..Ac|
TCP: 000000c0 63657074 2d4c616e 67756167 653a206a |cept-Language: j|
TCP: 000000d0 610d0a41 63636570 742d456e 636f6469 |a..Accept-Encodi|
TCP: 000000e0 6e673a20 677a6970 2c206465 666c6174 |ng: gzip, deflat|
TCP: 000000f0 650d0a55 7365722d 4167656e 743a204d |e..User-Agent: M|
TCP: 00000100 6f7a696c 6c612f34 2e302028 636f6d70 |ozilla/4.0 (comp|
TCP: 00000110 61746962 6c653b20 4d534945 20362e30 |atible; MSIE 6.0|
HTTPリクエストヘッダーの内容
TCP: 00000120 3b205769
6e646f77 73204e54 20352e31 |; Windows NT 5.1|
TCP: 00000130 290d0a48 6f73743a 20392e31 38382e35 |)..Host: 9.188.5|
TCP: 00000140 322e3731 0d0a436f 6e6e6563 74696f6e |2.71..Connection|
TCP: 00000150 3a204b65 65702d41 6c697665 0d0a0d0a |: Keep-Alive....|
47
<blank page>
48
問題解析のアプローチ
49
パフォーマンスとボトルネック
パフォーマンスが良いシステム
パフォーマンスの指標はレスポンスタイム(秒)とスループット(処理件数/秒)
「飽和点における最大同時ユーザー数が高く、スループットが高く、レスポンスタイムが
短い」
その際、各サーバーのCPUが100%であればシステムが最大の処理能力を発揮してい
ることになる。
ボトルネックが発生したときに起こる現象
飽和点に達してもCPUが使われていない
レスポンスが遅い、またはスループットが出し切れていない。
飽和点に達してから、スループットが急激に悪化する
スループットは同時アクセス数と同時に増加。
やがて一定になり、さらに増加すると徐々に低下
レスポンスタイムは同時アクセス数が増加してもほぼ一定。
やがて増加し始める
スループットが一定になり、レスポンスタイムが
上がり始める点が飽和点(saturation point)。
このときCPUが100%であれば、そのシステムは
最大の処理能力を発揮。
50
ボトルネックの要因
ハードウェア
ミドルウェア
CPU、メモリ、I/O
EdgeやIHS、WAS、DBのチューニングパラメータ
ネットワーク
アプリケーション
ボトルネックの特定が重要
ボトルネックの特定が重要
51
ボトルネック発見のアプローチ(1)
現象
飽和点に達しても
CPUが使われていない場合 1/4
飽和点に達してもCPUが使われていない
予測
各サーバーの処理能力に余裕があるにも関わらず、スループットやレスポンスタイム
が頭打ち
どこかでリクエストが滞留しているのでは?
検証
まずは滞留している場所を突き止める
取得項目
IHSのアクセスログ、プラグインのログ、WASのSystemOutログ(要求メトリックを設定)
IHSのアクセスログからレスポンスタイムを取得
要求メトリックを取得し、各コンポーネントのレスポンスタイム取得
それぞれのレスポンスタイムの差から各コンポーネントでの処理時間を計算
著しく処理時間の長いところに注目!
52
ボトルネック発見のアプローチ(1)
飽和点に達しても
CPUが使われていない場合 2/4
著しく処理時間の長いところに注目!
Webサーバーで遅い
Webサーバー内で待ちが発生している可能性
プラグインからWebコンテナー間で遅い
WebコンテナーからEJBコンテナー間で
遅い
Webコンテナー前で待ちが発生している可能性
プラグインとWebコンテナー間のネットワーク遅延の可能性
EJBコンテナーの前で待ちが発生している可能性
Webコンテナー、EJBコンテナー間のネットワーク遅延の可能性
Webコンテナー内のアプリケーションの処理が問題の可能性
EJBコンテナーで遅い
EJBコンテナー内のアプリケーションの処理が問題の可能性
EJBコンテナーからデータベース間で
遅い
クライアントのレスポンスタイムと
Webサーバーとの差が大きい
DBの前で待ちが発生している可能性
EJBコンテナー、DB間のネットワーク遅延の可能性
DB自体の処理で遅延している可能性
負荷ツールからWebサーバーの間のネットワーク遅延の可能性
Webサーバーの前で待ちが発生している可能性
53
ボトルネック発見のアプローチ(1)
飽和点に達しても
CPUが使われていない場合 3/4
以下の順番で遅延の原因を特定
1.待ちが発生している場合の確認方法
TPVでスレッドプールを確認、Webサーバーはログを確認
Webサーバーの前で待ちが発生している場合
同時リクエスト数を超えると、超えたことを示す警告がWebサーバーのエラーログに出力され
る
Webサーバーの最大アクセス数を大きくする
Webコンテナー、EJBコンテナーの前で待ちが発生している場合
TPVで各々のスレッドプールを確認し、使用率が100%のまま維持され続けていることを確認
Webコンテナ、EJBコンテナの最大サイズを大きくする
データベースの前で待ちが発生している場合
TPVでコネクションプールを確認し、使用率が100%のまま維持されていることを確認
コネクションプールの最大接続数を上げる。DBのMAXAPPLSパラメータを上げる
2.ネットワーク遅延の確認方法
各々のネットワーク機器、サーバーで帯域での使用率やパケット量を確
認
ネットワーク機器のパラメータ調整、ネットワークカードやケーブルを変える
3.アプリケーション処理の遅延の確認方法
アプリケーションのコードを確認、必要があればプロファイラーを使用
アプリケーションの変更
54
ボトルネック発見のアプローチ(1)
飽和点に達しても
CPUが使われていない場合 4/4
アプリケーション分析
レスポンスの悪いロジックの特定
レスポンスの悪いロジックがある程度特定できている場合
IHSのアクセスログから、時間がかかっているリクエストURLを判断し、レスポンス
の悪いロジックに目星を付ける
関連するコードを追う
処理が複雑なときはプロファイラーを使用し、ボトルネックを探し出す
プロファイラー
アプリケーションのボトルネックやメモリリークを発見するためのツール
各クラス、メソッド単位の実行時間
オブジェクトのサイズ、参照関係
ヒープの使用状況、ガーベッジ情報
ボトルネックと判断された箇所についてロジックの見直しを行う
55
ボトルネック発見のアプローチ(2)
現象
レスポンス、スループットが
出し切れていない場合 1/5
飽和点に達するまでにレスポンスが悪い
飽和点に達するまでにスループットが悪い
予測
レスポンスタイムはいいが、スループットが悪い
負荷がかけきれていないのでは?
レスポンスタイムもスループットも悪い
どこかでマシンの処理能力が限界に達してるのでは?
検証
負荷が正しくかけられているか、マシンのハードウェアスペックに異
常はないかを突き止める
56
レスポンス、スループットが
出し切れていない場合 2/5
ボトルネック発見のアプローチ(2)
取得項目
負荷ツールのログ、各マシンのハードウェアスペック確認
負荷ツールのログを見る
負荷は想定よりも低い
負荷ツールマシン(クライアントマシン)のスペック確認
CPUなどが非常に高い
クライアントが負荷をかけきれていない可能性
負荷クライアントの増加
スペックに問題はない
負荷ツールの設定の確認
負荷は正しくかけられている
各サーバーマシンのスペック確認
CPUなどが非常に高いマシンがある
ハードウェアスペックがネックになって
処理がそこで遅くなっている!
CPUなどが高いマシンはない
リクエストの滞留によるスループット、
レスポンスタイム低下の可能性。
ボトルネック発見のアプローチ(1)の手順に。
57
レスポンス、スループットが
出し切れていない場合 3/5
ボトルネック発見のアプローチ(2)
取得項目(アプリケーションサーバー)
TPV(JVMヒープ確認)、verbose:gc(native_stderr.log)
ハードウェアスペックがネックになって
処理がそこで遅くなっている
WebサーバーのCPUなどが高い
マシンの処理能力の限界の可能性
アプリケーションサーバーのCPUなどが高い
アプリケーションサーバーのJVMヒープ、GCを確認
GCの発生頻度が低く、1度のGCで
全体の85%以上が開放される
JVMの初期ヒープサイズが高すぎることで
GCにかかる時間が多いことによる
パフォーマンスダウンの可能性
JVMのヒープサイズを下げる
GCの発生頻度が高く、1度のGCで
30%しか開放されない。
ヒープの拡張も頻繁に起こる
ヒープを圧迫している
オブジェクトの調査
(可能なら)JVMのヒープサイズを上げる
データベースのCPUなどが高い
データの書き込み頻度が高すぎる可能性
不適切なSQL文によるデータベースに過大な
負荷をかけている可能性
マシンの処理能力の限界の可能性
58
レスポンス、スループットが
出し切れていない場合 4/5
ボトルネック発見のアプローチ(2)
取得項目
TPV(セッション確認)、HeapDump
(可能なら)JVMのヒープサイズを上げる
ヒープを圧迫している
オブジェクトの調査
アプリケーションサーバーのセッションオブジェクトを確認
活動中のセッションに比べ、アクセス中のセッションが少ない
かつ、セッションサイズが非常に大きい
セッションオブジェクトがヒープを圧迫している可能性
セッションオブジェクトの数、
サイズともに問題はない
セッションオブジェクトの数、タイムアウトを減らす
アプリケーションの再検討
HeapDumpを取得し、ヒープ内のオブジェクトを確認
数が多いオブジェクト、巨大オブジェクトの発見
アプリケーションを再検討
59
ボトルネック発見のアプローチ(2)
レスポンス、スループットが
出し切れていない場合 5/5
データベースがネックとなる場合
書き込み頻度
DiskへのI/Oでネック
書き込み頻度を検討。セッションDBの場合はWASの管理コンソールから指定可能
また、以下に示すようにSQL文を改善することで効果が得られる可能性も大
DBのデッドロック
スナップショットを取得し、デッドロックの確認
SQL文の調査
最適なSQL文は、もっとも少ないリソースを使用し、もっとも早く抽出可能な文
アクセスパス
INDEX
JOIN処理
発行されるSQL文を再検討
60
ボトルネック発見のアプローチ(3)
現象
飽和点に達した後、
スループットの急激な悪化 1/2
飽和点に達した後、スループットが急激に悪化する
予測
システムの処理能力が限界値を大きく超えた
どこかでマシンの処理能力が限界に達し、ダウン(もしくはハング)しているのでは?
検証
マシンのハードウェアに異常はないかを突き止める
61
ボトルネック発見のアプローチ(3)
飽和点に達した後、
スループットの急激な悪化 2/2
取得項目
各マシンのハードウェアスペックを確認
システムのアプリケーションにアクセス
全て正常
各サーバーマシンのスペック確認
ハードウェアスペックがネックになって、
処理が遅くなっている可能性。
ボトルネック発見のアプローチ(2)の手順に。
CPUなどが非常に高い
マシンがある
CPUなどが高い
マシンはない
リクエストの滞留によるスループット、
レスポンスタイム低下の可能性。
ボトルネック発見のアプローチ(1)の手順に。
レスポンスがないリクエストが存在
ハングしてるマシンを確認、そのマシンに対して問題判別を行う
アプリケーションサーバーの
OutOfMemory
HeapDumpを取得し、ヒープ内のオブジェクトを確認
数が多いオブジェクト、巨大オブジェクトの発見
62
アプリケーションを再検討
Webシステムにおけるチューニング項目
63
キューイングネットワーク
各コンポーネントでアクセス数を徐々に絞り込む
キューの最大数に達したとき、システムのCPUが適正使用率になるように設定
アプリケーションの構成も考慮に入れる
静的コンテンツが大半ならWebコンテナーのアクセス数に比べ、Webサーバーのアクセ
ス数が多くなるように設定
データソースにアクセスするアプリケーションが大半であれば、Webコンテナーへのア
クセス数とデータソースのアクセス数はあまり差をつけすぎないように設定
Clients
WebServer
WebContainer
150
待ち行列:50
スレッドプール
50
(TCPインバウンドチャネル)
待ち行列:100
Remote
EJBClient
EJBContainer
70
DataSource
最大接続プール
サイズ 30
ORBスレッドプール 待ち行列:40
最大サイズ:20
30
最大クライアント数
150
50
20
20
0
DB
64
キューイングネットワークのチューニング項目
Webサーバー
最大クライアント数
待ち行列
スレッドプール(WebContainer)の最大サイズ、最小サイズ
ORBスレッドプール
ListenBackLog
Webコンテナー
MaxClients、ThreadsPerChild
スレッドプールの最大サイズ、最小サイズ
データソース
最大接続数、最小接続数
接続タイムアウト(最大接続数を超えたリクエストの待ち時間)
65
Webシステムのチューニング
1.OSのチューニング
2.クライアントとWebサーバー間のチューニング
WebServer
WebServer
plugin
3.Webサーバーとアプリケーションサーバー間のチューニング
Application
Application
Server
Server
4.JVMヒープのチューニング
(WebContainer)
(WebContainer)
5.EJBコンテナーのチューニング
Application
Application
Server
Server
(EJBContainer)
(EJBContainer)
6.データベース接続に関するチューニング
DB
66
1.OSのチューニング
TCP/IP接続のタイムアウトはOSが所有するパラメータに依存
SYNを投げてから
どれくらい待つか?
SYN
SYN_SENT
アイドル状態の接続を
いつまでアクティブにし
ておくか?
ESTABLISHED
再送のためのパケットを
どれくらいの間隔で投げ
るか?
LISTEN
SYN|ACK
ACK
リクエストのやり取り
SYN_RCVD
ESTABLISHED
FIN | ACK
ACK
FIN_WAIT2状態で
FIN_WAIT1 どれくらい待つか?
CLOSE_WAIT
FIN | ACK
LAST_ACK
ACK
FIN_WAIT2
TIME_WAIT状態で
どれくらい待つか?
TIME_WAIT
67
TCP/IP接続に関するタイムアウト値
AIX V5.3の例
tcp_keepinit (デフォルト150 /0.5秒単位)
TCPコネクション初期タイムアウト値
ネットワーク障害などでSYNに対する返事がないとき、この値に従って接続が破棄される
tcp_keepidle (デフォルト14400 /0.5秒単位)
tcp_keepintvl (デフォルト150 /0.5秒単位)
通信を行っていないTCPコネクションを確認する時間
tcp_keepidle時に送信したパケットに返事がない際に、
再度確認のために送るパケットの送信間隔
tcp_keepcnt (デフォルト8)
tcp_keepidle時に送信したパケットに返事がない際に
再度確認のために送るパケットの数
(tcp_keepidle)+(tcp_keepintvl)×(tcp_keepcnt)=2時間10分。
デフォルトでは2時間10分経てば接続はOSが切断する
tcp_finwait2 (デフォルト1200 /0.5秒単位)
FIN_WAIT2状態で待つ時間
tcp_timewait (デフォルト1 /15秒単位)
TIME_WAIT状態で待つ時間
接続を終了するまえにサーバー側は「TIME_WAIT」状態で15秒は待つ
68
2.クライアントとWebサーバー間のチューニング
チューニングポイント
クライアント数、バックログ、KeepAlive接続、SSL通信、ファイル圧縮
ファイル圧縮
KeepAlive接続
スレ
ッド
スレ
ッド
スレ
ッド
WebServer
WebServer
親プロセス
Application
Application
Server
Server
(WebContainer)
(WebContainer)
子プロセス
plugin
SSL通信設定
処理待ち
クライアント数、
バックログ
access_log
69
クライアント数のチューニング - worker
AIX、HPUX、Soralis、Linuxはworkerモジュールをサポート
複数の子プロセスが各々複数のスレッドでリクエスト処理
<IfModule worker.c>内で定義
ThreadLimit 25
ServerLimit 64
スレッド
スレッド
スレッド
子プロセス
子プロセス
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
待機状態にあるスレッドの最大値
ThreadPerChild 25
待機状態にあるスレッドの最小値
子プロセス
MaxSpareThreads 75
同時に処理できるリクエストの最大数
MinSpereThreads 25
親プロセス
起動時のプロセス数の初期値
MaxClients 600
設定可能なサーバープロセスの上限値
StartServers 2
ThreadsPerChildに設定可能な上限値
各プロセスが生成するスレッド数
MaxRequestsPerChild 0
各プロセスが処理できるリクエスト数の最大値
70
クライアント数のチューニング – mpm_winnt
Windowsはmpm_winntモジュールをサポート
子プロセスは1つのみ。子プロセスが複数のスレッドでリクエスト処理
<IfModule mpm_winnt.c>内で定義
ThreadLimit 2048
ThreadsPerChild 250
MaxRequestsPerChild 0
親プロセス
同時に処理できるリクエストの最大数は
ThreadsPerChildで設定
子プロセス
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
71
クライアントチューニング時の注意
ServerLimit × ThreadsPerChild ≧ MaxClients
親プロセスが生成する子プロセスの数と子プロセスの生成する数の積が実
際にリクエストを処理する上限になる
満たさないとき、error_logに以下のWarningが出力される
MaxClinets150に対し、ThreadsPerChild25、ServerLimit1に設定すると、結局最大で25のリク
エストしか扱えない。
WARNING: MaxClients of 150 would require 6 servers,
and would exceed the ServerLimit value of 1.
Automatically lowering MaxClients to 1. To increase,
please see the ServerLimit directive.
処理可能な最大リクエスト数を超えたときのerror_log
使用率に余裕がある場合は、Webサーバーのボトルネックが考えられるので、
増加を検討
[Fri Aug 26 13:13:04 2005] [error] server reached MaxClients setting,
consider raising the MaxClients setting
[Mon Sep 19 16:01:14 2005] [warn] Server ran out of threads to serve requests.
Consider raising the ThreadsPerChild setting
72
バックログのチューニング
同時に処理可能な数を越えるリクエストが来た場合、あふれたリクエストは処理
待ちの状態で待たされる
OSのパラメータでも設定
ListenBackLog
AIXではsomaxconn (デフォルト1024)
処理待ちのキューの数を指定
httpd.confには記載がないが、デフォルトは511
処理を待たせてもエラーを返さないようにする場合は、ListenBackLogを増加させ、処
理待ちのリクエスト数を多くする
処理待ち可能なキューを確認する方法(AIX only)
(ポート番号におけるTCP番号を確認)
host1@root[/usr/IBMIHS2047/conf]netstat -aAn | grep LISTEN | grep 80
73686200 tcp
0
0 *.80
*.*
LISTEN
(kdbコマンド実行し、以下のコマンドを入力)
host1@root[/usr/IBMIHS2047/conf]kdb
(0)> sockinfo 73686200 tcpcb
---- SOCKET INFO ----(@ 73686200)---type........ 0001 (STREAM)
opts........ 000E (ACCEPTCONN|REUSEADDR|KEEPALIVE)
linger...... 0000 state....... 0180 (PRIV|NBIO)
pcb..............@73686154 proto............@024C8CE8
lock.............@736CF280 head.............@00000000
q0...............@00000000 q................@00000000
q0len....... 0000 qlen........ 0000 qlimit...... 01FF
timeo....... 0000 error....... 0000 special..... 0A08
pgid............. 00000000 oobmark.......... 00000000
qlimitが処理待ち可能なキューの最大数
(16進数)を示す。デフォルトでは1FF=511。
73
KeepAlive接続のチューニング
TCPコネクションを再利用し、毎回ハンドシェイクを繰り返す
ことによるオーバーヘッドを抑える。
複数の画像、フレームを含むコンテンツに有効
KeepAlive On
MaxKeepAliveRequests 100
KeepAlive接続の有無
1つのKeepAlive接続で受け付けるリクエスト数
一画面のフレーム、画像などの合計数程度
KeepAliveTimeout 15
次のリクエストまでに接続を保持する時間(秒)
リクエストが来るまで接続を確保するため、1-2秒程度の短い値が推奨される
74
SSL通信に関する設定
SSLコネクションの流れ
Server Hello
使用する暗号化アルゴリズムを指定
セッションIDがここで渡される
Client Hello
SSLアクセスを要求
暗号化方式のリストを渡す
サーバー証明書を送信
サーバー証明書がない場合に
メッセージを送信
クライアント証明を行う場合に
クライアント証明書の提示を要求
クライアント証明書を送信
Server Hello Done
一連の Server Hello 終了
セッションキーを生成する元と
なるデータを送信
サーバー側がクライアントと認
証を行うためのデータを送信
決定された
暗号化アルゴリズムを宣言
決定された
暗号化アルゴリズムを宣言
Finished
データの送信終了
(セッション確立)
Finished
データの送信終了
75
SSLハンドシェイクのキャッシュ
SSLハンドシェイクは接続に負担がかかるので、二回目からはセッション
IDをキャッシュする
ErrorLogのレベルをInfo以上にするとハンドシェイクのキャッシュが確認可能
1はSSLの新規接続
error.log (LogLevel info)
[Wed Sep 21 13:44:00 2005] [info] Session ID: AABjqsqzy6X02W9ygvVu4Sg9/CpYWFhYQzDlEAAAAAA=
[Wed Sep 21 13:44:00 2005] [info] New Session ID: 1
[Wed Sep 21 13:44:02 2005] [info] Session ID: AABjqsqzy6X02W9ygvVu4Sg9/CpYWFhYQzDlEAAAAAA=
[Wed Sep 21 13:44:02 2005] [info] New Session ID: 0
[Wed Sep 21 13:45:16 2005] [info] Session ID: AABjqsqzy6X02W9ygvVu4Sg9/CpYWFhYQzDlEAAAAAA=
[Wed Sep 21 13:45:16 2005] [info] New Session ID: 0
0はSSLセッションを再利用
SSLV3Timeout、SSLV2Timeoutを設定すると、SSLセッションIDのキャッシュ
にタイムアウトを設定できる
SSLV3はデフォルト120秒、SSLV2はデフォルト40秒
error.log (LogLevel info)
[Sun Nov 13 19:37:08 2005]
[Sun Nov 13 19:37:08 2005]
[Sun Nov 13 19:37:10 2005]
[Sun Nov 13 19:37:10 2005]
[Sun Nov 13 19:38:16 2005]
[Sun Nov 13 19:38:16 2005]
[Sun Nov 13 19:38:39 2005]
[Sun Nov 13 19:38:39 2005]
[Sun Nov 13 19:39:23 2005]
[Sun Nov 13 19:39:23 2005]
[info] Session ID: AABcXpR4hkJDp2yf9Jln0jQV7sVYWFhYQ3cXVAAAAAA=
[info] New Session ID: 1
[info] Session ID: AABcXpR4hkJDp2yf9Jln0jQV7sVYWFhYQ3cXVAAAAAA=
[info] New Session ID: 0
タイムアウトが来るとSSLハンドシェイクをやり直し、
[info] Session ID: AABcXpR4hkJDp2yf9Jln0jQV7sVYWFhYQ3cXVAAAAAA=
新しいセッションIDになる。
[info] New Session ID: 0
[info] Session ID: AABcXpR4hkJDp2yf9Jln0jQV7sVYWFhYQ3cXVAAAAAA=
[info] New Session ID: 0
[info] Session ID: AABcXsIqf40cfw2DV9ILA8lf+dRYWFhYQ3cX2wAAAAE=
[info] New Session ID: 1
76
SSLCipherSpec
SSLCipherSpecによる暗号化方式の指定
Client Helloでクライアントが対応している暗号化方式リストを渡す
Server Helloで暗号化を指定
SSL_RCA_WITH_RC4_128_MD5
SSL_RCA_WITH_RC4_128_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
SSL2_RC4_128_WITH_MD5
SSL_RSA_EXPORT_WITH_RC4_40_MD5
・・・・・・
IHSのSSLCipherSpecディレクティブで暗号化方式を指定
SSL_RC4_WITH_RC4_128_MD5
複数指定も可能
指定されたものに対応していない
ブラウザからの接続は拒否される
IHSv6.0、SSLv3で対応している
暗号化方式
77
ファイル圧縮の設定
ファイルを圧縮することにより、通信帯域の負荷を軽減し、通信時間を短縮
サーバー側には圧縮する分だけ負荷となるので、圧縮すべきものを見極める必
要がある
対応しているWebブラウザには制限がある
httpd.conf
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
pdfファイルやPOSTメソッドのリクエストは圧縮しない
SetEnvIfNoCase Request_URI "¥.pdf$" no-gzip
SetEnvIfNoCase Request_Method POST no-gzip
DeflateFilterNote ratio
圧縮比率をログに出力させる
</IfModule>
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i" %s' deflate
CustomLog logs/deflate_log deflate
deflate_log
"GET
"GET
"GET
"GET
/index.html HTTP/1.1" 793 (47) "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 200
/httpTech.main.gif HTTP/1.1" 110163 (99) "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 200
/httpTech.view1.gif HTTP/1.1" 1001 (94) "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 200
/sample.pdf HTTP/1.1" 848303 (-) "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 200
圧縮比率がログの()内に表示される
圧縮しないときより、送信バイト数が47%に減少
pdfファイルは圧縮されない
“GET /index.html HTTP/1.1" 1617 (-) "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 200
78
3.Webサーバーとアプリケーションサーバー間の
チューニング
チューニングポイント
Webコンテナースレッドプール、KeepAlive接続
プラグインの最大割り振り数、プラグイン構成ファイルの再ロード間
隔
Webコンテナーの
スレッドプール
プラグインの
最大割り振り数
WebServer
WebServer
Application
Application
Server1
Server1
(WebContainer)
(WebContainer)
plugin
設定ファイル
pluin-cfg.xml
KeepAlive接続
プラグイン構成ファイルの
再ロード間隔
http_plugin.log
Application
Application
Server2
Server2
(WebContainer)
(WebContainer)
Application
Application
Server3
Server3
(WebContainer)
(WebContainer)
79
チャネルフレームワーク
チャネル・フレームワーク
WAS共通のネットワークサービスをトランスポートチェーンとして定義
トランスポートチェーンは各プロトコルごとのチャネルを持ち、各々のチャネル
階層ごとに設定を行う。
Webコンテナーのスレッドプール
9080番などのポート番号をもつトランスポートチェーンのTCPインバウンド
チャネルに結びつけられて用いられる
Web Container
Webコンテナ・トランスポート・チェーン
トランスポート
チェーン
WCInboundDefault
Webコンテナー
インバウンド・チャネル
WCC_2
HTTP
インバウンド・チャネル
HTTP_2
TCP
インバウンド・チャネル
TCP_2
Port
:9080
ユーザーパーシスタント(キープアライブ)接続の有無
パーシスタントタイムアウトの設定
アクセスロギング設定(HTTPトランスポートログ)
スレッド・プールの指定
(複数チャネルで共通のスレッドプールを
指定可能)
80
Webコンテナー・トランスポートチェーン
トランスポートチェーン
3つのインバウンドチャネル階層を持つ
TCPインバウンドチャネルでは、
ポート、スレッドプールの選択、
最大のオープン接続数、タイムアウト、
アクセス制御を設定
Webコンテナーインバウンドチャネルでは、
判断ウェイト、書き込みバッファサイズを設定
HTTPインバウンドチャネルでは、
判断ウェイト、最大パーシスタント要求数、
ユーザーパーシスタント(キープアライブ)
接続の有無、タイムアウト、アクセスロギング、
エラーロギングの有無を設定
81
Webコンテナー・スレッドプールのチューニング
トランスポートチェーンはWebContainerというスレッドプールに結びつけられてい
る
スレッドプール内の設定
最大サイズ
最小サイズ
スレッド非活動タイムアウト
最大スレッド数を超えた割り振りの許可の有無
WebContainerスレッドプールの
最小、最大スレッド数を指定
プラグインからのリクエストは
TCPトランスポートチャネル内のキューが受け
取る
コンテナーのスレッドはクライアントから独立
プラグインからのリクエストを
TCPインバウンドチャネルの
キューで受ける
TCPインバウンドチャネルのキューから
スレッドプール(WebContainer)に
処理を送る
WebContainer
WebContainer
WebServer
WebServer
plugin
キューの最大接続数は20000
82
最小/ 最大スレッド数は30/50
KeepAlive接続のチューニング
Webサーバー、アプリケーションサーバー間のKeepAlive接続
各サーバーのトランスポートごとに設定
最大パーシスタント要求数
ユーザ・パーシスタント(キープアライブ接続)
1つの接続を流れるリクエストの数
0 or 1に設定すると、KeepAlive接続は行わない。
デフォルト100
アプリケーションサーバー選択し、
トランスポートを選択。
[HTTPインバウンド・チャネル]画面から設定
デフォルトON
チェックを外すとKeepAlive接続は行わない。
パーシスタントタイムアウト
KeepAlive接続が有効なときのタイムアウト
次のリクエストまでに接続を保持する時間
デフォルト30秒
83
V5でのKeepAlive接続
V5ではKeepAliveが有効になってる時間内は、スレッドはクライアントから
のリクエストに占有される
MaxKeepAliveConnection
ConnectionKeepAliveTimeout
同時にKeepAlive接続を行うコネクションの最大数(デフォルト:全スレッドの90%)
KeepAlive接続の要求待ち時間(デフォルト:5秒)
リクエストが増大し、KeepAliveスレッドが特定のクライアントに占有されて
しまうと、それ以外は残りで処理することになる
KeepAliveスレッドに時間がかかる場合、
残りのリクエストはこちらで処理
WebContainer
WebContainer
10%
NON-KeepAlive
WebServer
WebServer
plugin
KeepAlive
90%
KeepAlive
レスポンスが終了しても
タイムアウトが来るまで占有
84
V6でのKeepAlive接続
V6からはWebコンテナースレッドとクライアントが独立
KeepAliveのTimeoutによる切断を待たずに次のリクエストの処理
を実行可能。
V6ではデフォルトで全てのスレッドがKeepAlive対応
非KeepAlive接続の確保やタイムアウトの短縮が必要ない
処理待ちのリクエストはTCPのキューに残り、
1リクエストの処理終了後、スレッドが渡され
処理を実行。
WebContainer
WebContainer
WebServer
WebServer
plugin
KeepAlive
KeepAlive
KeepAlive
KeepAlive接続の切断を待たずに
次のリクエストの処理が実行される
85
プラグイン割り振り数のチューニング
MaxConnections
プラグインが各サーバーに処理を委ねる最大数
デフォルトは「-1」(無制限)
割り振られるものがなくなれば、503(Service Temponary Unavailable)がクライアントに
返される。
待ちには入らず、即時にクライアントに返される
WASの管理コンソールからも設定可能
プラグインの生成時に
プラグイン構成ファイルに反映される。
<Server ConnectTimeout="10" ExtendedHandshake="false" MaxConnections="10"
Name="mercuryNode01_server1" ServerIOTimeout="0" WaitForContinue="false">
<Transport Hostname="mercury" Port="9080" Protocol="http"/>
<Transport Hostname="mercury" Port="9443" Protocol="https">
<Property Name="keyring" Value="C:¥IBM¥WebSphere¥Plugins6¥etc¥pluginkey.kdb"/>
<Property Name="stashfile" Value="C:¥IBM¥WebSphere¥Plugins6¥etc¥pluginkey.sth"/>
</Transport>
アプリケーションサーバー選択し、[追加プロパティ]→
</Server>
[Webサーバープラグインプロパティ]を選択。
アプリケーションサーバーが処理できる接続の最大数
WebServer
WebServer
全て埋まった時にプラグインが
クライアントに503を返す。
Application
Application
Server1
Server1
maxConnections=10
Application
Application
Server2
Server2
maxConnections=5
plugin
この場合はTCPインバウンドチャネルにはストックされず、
即時にクライアントにエラーが返る。
86
構成ファイルの再ロード間隔
RefreshInterval
構成ファイルplugin-cfg.xmlの情報が読み込まれる間隔
デフォルト60秒
情報の更新から反映までの遅延として許容できる値に設定
Webサーバー選択し、[追加プロパティー]から
[プラグイン・プロパティー]選択
plugin-cfg.xml
<Config ASDisableNagle="false" AcceptAllContent="false" AppServerPortPreference="HostHeader"
ChunkedResponse="false" FIPSEnable="false" IISDisableNagle="false" IISPluginPriority="High"
IgnoreDNSFailures="false" RefreshInterval="60" ResponseChunkSize="64" VHostMatchingCompat="false">
87
4.JVMヒープのチューニング
チューニングポイント
JVMの初期ヒープサイズ・最大ヒープサイズ
ガーベッジコレクション(GC)
Javaでは不要になったオブジェクトをメモリ領域から開放する作業をJVMが実施
GCはパフォーマンスに影響するので、適切にGCを実施するように調整
Application
Application
Server
Server
物理メモリ領域
アプリケーションサーバーが
用いるメモリ領域
JVMの初期ヒープサイズ、
最大ヒープサイズ
-Xmx (JVMヒープの最大サイズ)
-Xms (JVMヒープの初期サイズ)
GC:JVMが行うメモリ管理
この処理が他のスレッドを停止し、
CPUに負荷をかける
88
JVMヒープサイズのチューニング
アプリケーションサーバーを選択、[Javaおよびプロセス管理]→[プロセス定
義]→[Java仮想マシン]
初期ヒープサイズ、最大ヒープサイズを指定
その他引数が必要な際は、汎用JVM引数の欄に指定
verbose:gcの出力 → 冗長ガーベッジコレクションの設定をON
GC頻度確認のために
verbose:gcをnative_stderr.logに出力
ヒープサイズの設定
89
JVMヒープサイズの設定
初期設定値
パフォーマンステストにて設定値を調整
起動時の早い段階からGCが頻発
すぐに最大ヒープサイズまで上昇し、その後もGCにより領域が確保できて
いない(目安は30%以下)
ヒープサイズが大きいとき
TPVによる使用メモリ、空きメモリ、合計メモリの確認
verbose:gcにてGC発生頻度の確認
ヒープサイズが小さいとき
初期ヒープサイズ:50MB
最大ヒープサイズ:256MB
1回のGCの開放量が大きくなる(目安は85%以上)
通常時は初期ヒープサイズで対応し、ピークに備えて最大ヒープサイズ
まで確保
初期ヒープサイズと最大ヒープサイズを同じに設定すると、通常時にGCの
開放量やGCにかかる時間が大きくなる
90
verbose:gc
GC発生状況の把握
ヒープサイズが大きいときの例
native_stderr.log
1回のGCの開放量が高く(85%以上)、
時間も多く取られている(長いと判断する目安は3秒)
<AF[2]: Allocation Failure. need 524 bytes, 555510 ms since last AF>
<AF[2]: managing allocation failure, action=1 (524328096/536869376)>
<GC(2): GC cycle started Sat Nov 19 16:43:40 2005
<GC(2): freed 1358776 bytes, 97% free (525686872/536869376), in 1067 ms>
<GC(2): mark: 41 ms, sweep: 1726 ms, compact: 0 ms>
<GC(2): refs: soft 0 (age >= 32), weak 0, final 412, phantom 0>
<AF[2]: completed in 1767 ms>
<GC(3): freed 0 bytes, 96% free (520100792/536869376), in 1169 ms>
<GC(4): freed 0 bytes, 91% free (489700016/536869376), in 1409 ms>
ヒープサイズが小さいときの例
native_stderr.log
<AF[60]: Allocation Failure. need 800016 bytes, 48 ms since last AF>
<AF[60]: managing allocation failure, action=2 (26827152/88865280)>
<GC(60): GC cycle started Fri Aug 12 14:30:23 2005
<GC(60): freed 320080 bytes, 30% free (27147232/88865280), in 237 ms>
<GC(60): mark: 219 ms, sweep: 18 ms, compact: 0 ms>
<GC(60): refs: soft 74 (age >= 1), weak 1, final 20, phantom 0>
<AF[60]: completed in 242 ms>
1回のGCの開放量が小さく(30%以下)、
短期間でGCが頻発している
<GC(61): freed 38120 bytes, 29% free (26383920/88865280), in 283 ms>
<GC(62): freed 17760 bytes, 30% free (27162144/90438144), in 143 ms>
91
verbose:gcの解析ツール
GCCollector (v1.2)
GUIベースでverbose:gc出力をグラフ化して解析可能
JDK 1.2.2以上のJavaランタイム環境で動作
以下から自由にダウンロード可能
http://www.alphaworks.ibm.com/tech/gcdiag/
jfreechart-0.9.21.jarとjcommon-0.9.6.jarをダウンロードし、インストールディレクトリのlib以下に配置
する必要
http://sourceforge.net/projects/jfreechart
GCCollectorコマンドを実行
verbose:gcのサマリー、
生データ、一覧表を表示
GC間隔、GC所要時間、
GC後のヒープ領域、AllocFailureを、
時系列にグラフ化表示
各GCを整形して表示
92
HeapDumpの解析ツール(Heaproots)
Heaproots
CUIベースのHeapDump解析ツール
JDK1.3.1 SR3 (excluding z/OS) 、 1.4.1 SR1 以上を推奨
以下から自由にダウンロード可能
http://www.alphaworks.ibm.com/tech/heaproots
HeapDumpファイル(テキスト)をheaprootsに読み込ませて実行
java –jar HR205.jar <heapdump.txt>
java –jar <HR_root>¥HR205.jar <heapdump.txt>実行時の出力
>java -jar C:¥IBM¥WebSphere¥AppServer6¥HeapRoots205¥HR205.jar
C:¥IBM¥WebSphere¥AppServer6¥profiles¥Custom01¥hea
pdump.20050925.170523.4032.txt
・・・・・(中略)・・・・
Successfully opened 'C:¥IBM¥WebSphere¥AppServer6¥profiles¥Custom01¥heapdump.2005
0925.170523.4032.txt'. This filename was derived from 'C:¥IBM¥WebSphere¥AppServe
r6¥profiles¥Custom01¥heapdump.20050925.170523.4032'.
Dump comments
: // Version: J2RE 1.4.2 IBM Windows 32 build
cn142-20050609
// Breakdown - Classes: 9721, Objects: 248968,
ObjectArrays: 52899, PrimitiveArrays: 71720
// EOF: Total 'Objects',Refs(null) :
383308,914835(244817)
Dump has flags
: false
# Objects
: 383,308
# Refs
: 914,835
# Unresolved refs : 0
Heap usage
: 22,953,760
Total object range : 669,388,960
Extra stats
: unavailable before processing
HR Memory Usage
: 12/35 mb
Enter: o{a,s,t,d,m,n}, g{c,s}, t{c,s,n}, i, p, d{t,d,m} or help for more info
>
93
HeapDumpの解析ツール(Heaproots)
オブジェクトのサイズ順ソートの例
どのオブジェクトがヒープを占めているのかの判断
tsコマンド実行
tsコマンド実行時の出力
Enter: o{a,s,t,d,m,n}, g{c,s}, t{c,s,n}, i, p, d{t,d,m} or help for more info
> ts
Heaprootのプロンプトからts入力
Enter name to filter on or '-' for no filtering [-]
>
Enter range of lines to print in format 'M','L-U','-U' or 'L-' [1-10]
>1-5
サイズ順で1位から5位までを表示させる
Tabulating all objects, sorted by total-size
Count Total-size Type Name
------------------------------------------------------------------------------58,293 6,328,592 char[]
ヒープ内のオブジェクトをサイズ順に表示
61,649 1,972,768 java/lang/String
(Countはオブジェクト数を示す)
31,760 1,016,320 java/util/HashMap$Entry
ヒープ上をどのオブジェクトが占めているのかがわかる
1,423 746,176 byte[]
9,810 587,360 array of java/lang/Object
Displayed results : 1-5
Matched types : 12,915 / 12,915
Usage count
: 324,767 / 324,767
Total size
: 20,420,672 / 20,420,672
94
HeapDumpの解析ツール(HeapAnalyser)
HeapAnalyser (V1.3.5)
GUIベースのHeapDump解析ツール
JDK1.4.1以上のJavaランタイム環境で動作
以下から自由にダウンロード可能
http://www.alphaworks.ibm.com/tech/heapanalyzer
ha135.jarを実行
java –jar ha135.jar
ヒープ内のオブジェクトの
階層構造を表示
ヒープ内のオブジェクトを
サイズ順にソート
HeapDumpのサマリー
95
セッションオブジェクトの設定
管理コンソールからアプリケーションサーバーを選択し、[Webコンテナー
設定]→[セッション管理]
メモリー内の最大セッションカウント、セッションタイムアウトを設定。
デフォルトは1000セッション、タイムアウトは30分。
「オーバーフローの許可」は非分散環境のみ有効
メモリー内のセッション数と
オーバーフローの許可
セッション・タイムアウト
96
5.EJBコンテナーのチューニング
チューニングポイント
ORBスレッドプール
Application
Application
Server
Server
(EJBClient)
(EJBClient)
Application
Application
Server
Server
(EJBContainer1)
(EJBContainer1)
ORBスレッドプールサイズ
DB
Application
Application
Server
Server
(EJBContainer2)
(EJBContainer2)
97
ORBスレッドプールのチューニング
EJBクライアントとEJBコンテナーが同一アプリケーションサーバー上に配置した
場合、同一アプリケーションサーバー上で処理
リモートのEJBクライアントからのアクセスに対する最大・最小スレッド数の設定
デフォルトは最大50スレッド、最小10スレッド
アプリケーションサーバー選択し、[コンテナーサービス]→[ORBサービス]→[ス
レッド・プール]
同一アプリケーションサーバー上にあれば
ローカルで処理
Application
Application Server
Server
EJB Client
EJB Container
ORBスレッドプールの
最小、最大スレッド数を指定
リモートのEJBクライアントからのアクセス
Application
Application
Server
Server
EJB Client
Application
Application
Server
Server
EJB Container
98
EJB WLMのパラメータ
アプリケーションサーバー選択し、[サーバー・インフラストラク
チャー]→[プロセス定義]→[Java仮想マシン]の汎用JVM引数で定義
com.ibm.CORBA.requestTimeout
メソッドコール中のネットワーク障害、処理滞留によりタイムアウト
(org.omg.CORBA.NO_RESPONSE)とみなすまでの時間
デフォルト180秒
com.ibm.websphere.wlm.unusable.interval
ダウンとみなされたサーバーに対し、再度リクエストを割り振るまでの間隔
デフォルト300秒
99
6.データベース接続に関するチューニング
チューニングポイント
コネクションプール、PreparedStatementキャッシュサイズ
セッションデータベースの設定、書き込み頻度
Application
Application
ConnectionPool
Server
Server
セッションDBの設定、
書き込み頻度
DB
コネクションプールの
最大・最小接続数
Collection object
PreparedStatement
キャッシュサイズ
100
コネクションプールのチューニング
データソースの接続数の設定
JDBCプロバイダーとデータソースを選択し[接続プール・プロパティー]。一般プロパ
ティーの最大接続数、最小接続数で指定
通常時は最小接続数で対応し、ピーク時に最大接続数で対応するように設定
プール内のコネクションオブジェクトの使用率が100%の状態が続き、接続待ちや、
接続タイムアウトによるエラーとなったリクエストが多い場合は、コネクションプール
の最大接続数の増加を検討
接続タイムアウトの設定
接続要求が待機する時間。
タイムアウトになるとConnection
WaitTimeoutExceptionが返される
デフォルト180秒
101
PreparedStatementキャッシュサイズ
1コネクションあたりにPreparedStatementをキャッシュ
JDBCプロバイダーとデータソースを選択し、[WebSphere Application
Server データ・ソース・プロパティー]。一般プロパティーの「ステートメント・
キャッシュ・サイズ」で設定
PreparedStatementの破棄数が多いようであれば、増加を検討
デフォルトでは10ステートメント
ConnectionPool
DB
Collection object
SELECT A from Table where id = ?
SELECT B from Table where id = ?
INSERT into Table (A,B) value (?,?)
102
セッションデータベースの設定
セッションをデータベースに保管する際の設定
アプリケーションサーバーを選択し、[Webコンテナー設定]→[セッション管
理]→[分散環境設定]から、分散セッションにデータベースを選択
複数行スキーマの使用
デフォルトでは1セッションにつき、単一行にデータが書き込まれる
チェックをONにすると、複数行に分けてデータを書き込む
セッションデータが大きい場合に用いる(2MB以上は必須)
DB2行サイズ(DB2 UDB Only)
DB2はページ単位で読み込み、
書き込みを行う
デフォルトのページサイズは4kB
セッションオブジェクトサイズ≦
ページサイズとすることで
パフォーマンスの向上が見込める
DB2行サイズ
8kB
DB
Buffer
セッションオブジェクトの
サイズが8kBであれば、
ページサイズも4KBより8KBの
ほうがパフォーマンスは上がる
複数行スキーマの使用
Table
103
セッションオブジェクトの書き込み頻度
セッションオブジェクトが書き込まれる頻度の設定
アプリケーションサーバーを選択し、[Webコンテナー設定]→[セッション管理]→[分散
環境設定]から[カスタム・チューニング・パラメーター]
書き込み頻度(serviceメソッド終了、手動、時間基準)
書き込みの内容(更新された属性のみ、全てのセッション属性)
セッションクリーンアップのスケジュール(時間基準でセッションをクリーンアップ)
チューニングレベルを上げると、パフォーマンスは良くなるが、書き込み頻度が抑えら
れるため、可用性は下がる
デフォルトでは書き込み頻度10秒、内容は更新された属性のみ、セッションクリーン
アップはしない。
チューニングレベル(非常に高)
パフォーマンスの最適化
「カスタム」を選択すると、
書き込み頻度、書き込みの内容、
セッション・クリーンアップのスケジュールが
設定可能。
チューニングレベル(低)
フェイルオーバーの最適化
104
参考文献
105
参考文献
Information Center
WebSphere Application Server V6.0
pSeriesおよびAIX (AIX 5L™ バージョン 5.3 パフォーマンス・マネージメント・ガイド)
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp
http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/aixbman/prftungd/prftungd.
htm
WorkShop
WebSphere Application Server V6 Announcement Workshop(2004.12)
WebSphere Update ワークショップ 2004.06(2004.6)
WebSphere V5.1 問題判別の心得(2004.6)
WAS 5.1 インフラ構成の心得(2004.4)
WebSphere パフォーマンス・チューニングと問題判別(2003.9)
RedBook
WebSphere Application Server V6 Scalability and Performance Handbook
WebSphere Application Server V6 System Management and Configuration Handbook
106
Fly UP