パフォーマンス最大化とシステム安定性の問題
* 安定化
システムリソース(CPU使用率やメモリ)の限界への到達を防ぎ、提供しているサービス全体やシステム自体が不安定になることを防ぐ。
* バックエンド保護
より重要なバックエンドの処理部分が過負荷になることを防ぐため、フロントエンド側で流量の制御を行って、バックエンドを守る。
* 処理ルートの正常管理
同時に処理しきれないリクエストを、処理待ち行列で待機させたり、予め容易しておいた正規のエラー通知(SORRYページ等)にまわす等、定義済みの管理可能な処理の流れに適合させる。
* 変更可能パラメータ
同時実行処理の数を制限する何らかのチューニングパラメーターが容易されており、設定の変更が可能。
* 計測可能であること
特に絞り込みを通したチューニングや性能管理を行う上では、サーバーの動態を把握するために下記の項目の値が得られることが望ましいです。o 最大処理可能数
o 実行中のビジー数
o アイドル数
o 待ち行列数
o 単位時間あたりの平均処理時間
o 累積処理件数
o 累積エラー件数
使用するプラットフォームやアプリケーションによっては、予めこれらの機能が用意されており、簡単に取得することが可能なものもありますが、特にアプリケーション部分では、自分達で設計・開発時に意識的に実装し用意しておくという心がけも必要であると思われます。
* 待ち処理の機能
絞り込んだ際に処理に回りきらなかったリクエストを処理待ちとして待機させ、処理余力が回復した時点で順次処理・解消されてゆくようなアプリケーション上の機能(処理待ちキュー、プール、バックログ等)が実装されていること
* エラー処理
処理待ち時のタイムアウトや、待ち行列の上限を超えた場合のリクエストの拒絶等を判り易い形で通知出来るようにしておくことによって、サービス利用側に余計な混乱が生じることを防ぎます。
ユーザーのアクセス
↓
ファイアーウォール
↓
ロードバランサー
↓
Webサーバー
↓
APサーバー(J2EE)
↓
DBサーバー
1.ファイアーウォール/ロードバランサー
・ネットワーク帯域幅制限
・コネクション数(TCP、SSL、HTTPセッション数)制限
2.Webサーバー
・TCPソケットLISTEN数(バックログ)制限
・同時実行クライアント数の制限
3.J2EE(Webコンテナ)
・最大実行スレッド数の制限
・スレッド処理待ち数の制限
4.J2EE(JDBCデータソース)
・最大プールサイズの制限
* 設計段階
手順としては、まずシステム構成の設計段階において、アプリケーションやシステムの動作を推測して、おおまかなパラメータ毎の予測値を算出し、それぞれ上限設定を定義しておきます。
* 負荷テスト
そして、システムの総合テスト段階で、負荷テストを行います。
この負荷テストは、実際のユーザーの利用ケースに即したアクセスを生成し、実際のシステムの振る舞いに近い状態を再現する必要があります。もし、利用ケースが異なれば先述の入り口と出口の比率の関係が変わりますので、最適な絞り込みの設定パラメータも異なってしまいます。
この負荷テストで、予め要求されている性能目標(応答速度やボリュームや機能性)が 維持出来ているならば、特に絞り込みを行う必要性は無いでしょう。
* 性能目標を達成できなかった場合
もし、性能目標を満たすことが出来なかった場合には、ボトルネックを解析し、その要因を突き止め、改善方法を追求する必要があります。ボトルネックは基本的にはサーバー構成単位で負荷の切り分け、コンテナ単位での処理待ち発生の切り分けによって解析する方法を用います。
切り分けに際しては、e-Test suiteのServerStats等の負荷の量やユーザー操作毎の応答速度と、サーバー側のシステム負荷やパフォーマンスメトリックのグラフによる相関分析が出来るツールが便利です。
* 切り分け時に着目するポイント
特に以下のパラメータに着目して、関連情報を分析することで切り分けが容易になります。1.各サーバーのCPUやメモリ使用率* ボトルネック解明後
2.プロセス毎のCPUやメモリ使用率
3.グラフ上でピークに達して頭打ち減少を起こしているパラメータ
4.ページの応答速度の劣化のタイミングで急激に変化しているパラメータ
5.入り口と出口の流量の比例関係が変化しているポイント
6.処理待ち数の大量発生
遅延要因を突き止めた場合には、その内容を改善出来そうな絞り込みの設定の変更(チューニング)を行います。ここでは、もし確実な最適値が算出出来ていなくても構いません。
修正した推測値を設定し、再度、負荷テストを行って実際に性能を検証することが改善状況の確認の上で重要ですので、絞り込みのパラメーターを最適値に導くまでに何度かの繰り返しの負荷テストを行うというプロセスが必要となります。
