パフォーマンスの指標
スループット
単位時間(秒)あたりにシステムにより処理されるリクエスト数
システム全体の処理能力
応答時間
リクエストを出してから、結果が戻りきるまでの時間
ユーザーからみた処理能力
性能評価
スループットグラフ
横軸を同時ユーザー数、縦軸をスループット
応答時間グラフ
横軸を同時ユーザー数、縦軸を応答時間
スループット
スループットグラフ
システムの状態
Aゾーン
アクセス数増加に伴いスループットも増加
すべてのリクエストを滞留させることなく処理できている状態
Bゾーン
CPU100%後もアクセス数増加で、応答時間は悪化するが、スループットは増加
アクセス数が許容量(飽和点)を超えると、スループットは落ち始める
Cゾーン
飽和点をさらに超えると、システムとして不健全な状態
資源の競合やページングの頻発により本来の能力が発揮できない状態
CPUの使用率が低いにもかかわらず、スループットが飽和点に達する場合、能力を活用し切れていない。
ボトルネックの追求、解消が必要
想定アクセス数に対して、AまたはBゾーンの範囲で稼動できるようにチューニングを行う
応答時間
応答時間グラフ
リクエストが処理能力を超えると、応答時間は急激に悪化
適切にチューニングされていればエラーを戻すなど、応答時間は一定限度内に収まる
チューニングが不適切な場合、応答が戻らない自体
動的キャッシュ
v4以降、動的コンテンツをキャッシュする機能をサポート
JSPやサーブレットなどの動的コンテンツやコマンドの実行結果をWAS上にキャッシュする
JVMヒープに保管
cachespec.xmlで定義
サーブレット/JSP・キャッシュ
コマンド・キャッシュ
オブジェクト・キャッシュ
Webサービス・キャッシュ
ロケーション
チューニング
基本ポイント
キューイング・ネットワーク
クライアントからのリクエスト
ランダムに到達
リクエスト数に波がある
一度に処理するリクエスト数の制限
各々のコンポーネントの入り口
Webサーバー、アプリケーション・サーバー、データベース
処理しきれない分は行列に並ばせ、順番に受け付け
一定限度までのリクエストは並行に処理
設定された数を超えた同時リクエストは、キューに入れられる
キューへの送信側で設定されたタイムアウト値を超えた場合は、クライアントにエラー
適切なタイムアウトの設定
システムの許容量を超えたリクエストがあった場合に、ユーザーのストレスを軽減
システムの負荷を必要以上に大きくしない
種類
オープン・キュー
活動状態にあるリクエスト数に制限なし
クローズド・キュー
活動状態にあるリクエスト数に上限
活動状態か待ち状態のいずれか
キューイング・ネットワーク
原則
一般的には、ネットワーク側(Webサーバーの手前)で処理を待つリクエストの数を多く、アプリケーション・サーバー内部で処理を待つリクエストの数が小さくなるように調整
リクエストをできるだけネットワーク側で待たせることによってアプリケーション・サーバーへの負荷を軽減
バックエンド側のスレッド数を増やしたい場合は、その前段のコンポーネントのスレッド数も増加させて多くのリクエストを受け付けるようにする必要
理想的には、システムの負荷テストを行った上で、それぞれのキューの最大数に達したときにシステムのCPUの使用率が100%となり、システムの最大のパフォーマンスが得られるように、パラメータを設定
WASパラメーター設定
Webサーバー
<IHS_root>/conf/httpd.confファイル
最大同時実行数
MaxClients/ThreadsPerChildディレクティブ
設定値を超えた要求に対するタイムアウトは、Webブラウザーごとの実装によって決定
Webコンテナー
最大同時実行数
Webコンテナー・スレッドのパラメーター
[サーバー] → [アプリケーション・サーバー] → [ApplicationServer_name] → [コンテナー設定] → [Webコンテナー設定] → [Webコンテナー]
[追加プロパティ]→[Webコンテナー・トランスポート・チェーン]→[WCInboundDefault]→[TCP インバウンド・チャネル(TCP 2)]→[関連項目]→[スレッド・プール]→[WebContainer]
プール内のスレッドは、[最大サイズ]で設定した値まで、作成可能
接続の最大値
① [サーバー] → [アプリケーション・サーバー] → [ApplicationServer_name] → [コンテナー設定] → [Webコンテナー設定] → [Webコンテナー・トランスポート・チェーン]
[WCInboundDefault] → [TCP インバウンド・チャネル(TCP 2)]
[最大のオープン接続数]で設定した数だけの接続を受け付け
データソース
最大同時実行数
[リソース] → [JDBCプロバイダー] → [JDBCProvider_name] → [追加プロパティ] → [データ・ソース] → [DataSource_name] → [追加プロパティ] → [接続プール・プロパティ]
最大接続数で設定
Webサーバー
v1.3とv2.0/6.1でリクエストの処理方法が異なる
v1.3(UNIX系)
親プロセスは、子プロセスを生成してIHSに来るリクエストを処理
同時に処理可能なリクエストの数は子プロセスの数に依存
生成する子プロセスの数はhttpd.confファイルで設定可能です。最大同時実行数はMaxClientsで決定
v2.0/6.1(UNIX系)
各々の子プロセスがスレッドを生成し、そのスレッドによってリクエストが処理
同時に処理できるリクエスト数はhttpd.confファイルで設定するMaxClientsで決定されますが、指定された数はリクエストを実行するスレッドの最大数
v1.3よりも少ない子プロセス数で多くのリクエストを実行
子プロセスの生成にかかる負荷を抑制
v1.3/2.0/6.1 (Windows)
生成された親プロセスによって、1つの子プロセスが生成
子プロセスがスレッドを生成し、そのスレッドによってリクエストが処理
最大同時実行数はThreadsPerChildで決定され、指定された数は生成される最大スレッド数
データベース接続
接続プール・サイズ
データベースへの接続を作成する処理は、非常に負荷のかかる処理
WASでは作成した接続をプールして再利用するという仕組み
Prepared Statement Cacheサイズ
WASでステートメント・キャッシュを利用すると、データベース側でプリペア処理が行われたSQLがWASにキャッシュされ、効率的にプリペア処理を省略することができる
ステートメント・キャッシュは接続プールのコネクションごとにキャッシュ
[リソース]→[JDBCプロバイダー]→[JDBCProvider_name]→[追加プロパティ]→[データ・ソース]→[DataSource_name]→[追加プロパティ]→[WebSphere Application Server データ・ソース・プロパティ] → [ステートメント・キャッシュ・サイズ]
JVMメモリー
GCポリシー
JVM(具体的にはJVMのSTコンポーネント)が提供するメモリ管理方法はGCポリシーを指定することで変更することができる
STコンポーネントはヒープ内のどこに空き領域が存在するかを管理
J9 VMで利用可能なGCポリシー
Optimize for Throughput
デフォルトのポリシー
Mark-Sweep-Compactionの三つのフェーズに分けて実施
Compactionフェーズはオブジェクトの移動が伴い高負荷なので、発生条件が整ったときにのみ実施
ガーベッジ・コレクション実行中はヒープへのアクセスを行っているすべてのスレッドが停止
Optimize for Pause Time
レスポンス・タイムのばらつきが小さいことがより優先されるケースに検討
Mark-Sweep-Compaction型
リクエスト処理している時間帯にMark処理もこまめにやってしまうことで停止時間を短縮
スループットの面で不利
Generational Concurrent
一般に「世代別GC」と呼ばれる方法を採用
個々のオブジェクトの想定される生存期間に応じて、ヒープ・アロケーションを行う場所を変えながらヒープ全体を管理
Nursery領域とTenured領域と呼ばれる二つの異なる領域に分割
Nursery領域
新規に生成されるオブジェクト
さらに二つの領域
Allocate領域
まずAllocate領域
Survivor領域
Allocate領域がいっぱいになると、ヒープ内の「生きた」オブジェクトのトレースが行われます。その際に、「生きた」オブジェクトがあるとそのオブジェクトをSurvivor領域にコピー
Allocate領域の全体のチェックが終わると、「生きた」オブジェクトはすべてSurvivor領域にコピー
Survivor領域を使ってこれ以降のリクエスト処理を行える
Allocate、Survivor領域の役割を入れ替え
Tenured領域
ある回数のガーベッジ・コレクションをくぐり抜けて「生存」し続けることができると移動
「短命」のオブジェクトに対して集中してGC
Subpooling
ヒープ・アロケーションのアルゴリズムを変更することで適切なパフォーマンスを得ることを目的
POWERアーキテクチャーのCPUを利用したプラットフォームであることが必要条件
ヒープサイズ
ヒープサイズが実際の必要量よりも少ない場合
ガーベッジ・コレクションの実施頻度が上がる
最悪の場合メモリ不足エラー(OutOfMemory)
ヒープサイズが実際の必要量よりも多すぎる場合
ガーベッジ・コレクションの実施時間が長くなる
OSから割り当て可能なサイズを超えて設定をしてしまうと、ページングが発生する恐れ
二通りの考え方
JVMに動的に変更できるように設定
最小ヒープサイズを最大ヒープサイズよりも大きくすることで、差分の範囲でJVMがヒープサイズ調整のアルゴリズムの則って動的にヒープを変更
ヒープサイズを固定
最小ヒープサイズと最大ヒープサイズを同じ値にすることでサイズが固定
一般的な設定指針
必要とするタイミングで必要な量だけのヒープをWAS(JVM)が確保できるように必要十分なサイズを確保
設定
[サーバー]→[アプリケーション・サーバー]→[ApplicationServer_name]→[サーバー・インフラストラクチャー]→[Javaおよびプロセス管理]→[プロセス定義]→[追加プロパティ]→[Java 仮想マシン]
モニタリング・ツール
Performance Monitoring Infrastructure
WASでは各リソースの様々なパフォーマンスデータをMBean(Managed Bean)という特別なJavaBeanに格納
PMIはこのMBeanと通信して各コンポーネントの必要なパフォーマンスデータを取得
設定
管理コンソールによってPMIを使用可能にする必要
[モニターおよびチューニング]→[Performance Monitoring Infrastructure (PMI)]→[AppServer_name]を選択して、構成タブの[Performance Monitoring Infrastructure (PMI)を使用可能にする]にチェック
要求メトリック
主要コンポーネントにおいて経過した時間を計測し、ログに記録する機能
[モニターおよびチューニング]→[要求メトリック]
、[要求メトリックを使用可能にする]にチェック
ログの解析
Tivoli Performance Viewer
PMIを使用してパフォ-マンス・データを取得
WASの管理コンソールに組み込まれている
モニターの開始
[モニターおよびチューニング]→[Performance Viewer]→[現行アクティビティ]
[コレクション状況]が[使用可能]から[モニター対象]
この時点からパフォーマンス・データの収集が開始
ユーザー設定
ナビゲーション・ツリーより[設定]→[ユーザー]
リフレッシュ速度
データ表示
ロギング設定
期間
[ロギング開始]をしてから[ロギング停止]を行わない限り、ロギングを継続する時間を設定します。デフォルトでは20分
現行アクティビティの表示
チェック・ボックスにチェックを付けたモニター項目についてビューアーに表示
[モジュールの表示]ボタンを押すことで、ビューアーにグラフ表示
モニタリング・ポイント
ログの再生
[モニターおよびチューニング]→[Performance Viewer]→[ログの表示]
② [ログ・ファイルの明示的パス]にチェックをいれて、参照ボタンでログ・ファイルを選択
パフォーマンス・アドバイザー
Runtime Performance Advisor
アプリケーション・サーバー上で稼動し、パフォーマンスを定期的にチェック
[WebSphere ランタイム・メッセージ]と標準出力であるSystemOut.logファイルに出力
デフォルトでは使用可能になっていない
[サーバー]→[アプリケーション・サーバー]→[ApplicationServer_name]→[パフォーマンス]→[Runtime Performance Advisor構成]
構成タブの一般プロパティで[Runtime Performance Advisorを使用可能にする]のチェック
TPV Advisor
管理コンソールでリソースの状況やアドバイスを表示
TPVコンソール・パネルのナビゲーション・ツリーの[アドバイザー]を選択してTPV Advisorを表示