・レスポンス
リクエストへの応答。
レスポンスの遅さが原因の場合、CPUを増やしても意味が無い。
レスポンスが速いとスループットも上が、ディスクI/Oなどの物理的に速くするのは限界がある。
・IOPS
1秒当たりの読み書き回数
・スループット
単位時間あたりの処理量
・キャッシュヒット率
処理回数のうち、キャッシュで処理できたものの割合。
キャッシュが使われているか確認できる。
100%に近ければよいとされる。
ただし、バッチ処理の際はあまり使用しないデータも含まれており、
キャッシュ使用率が低いこともある。
・ダーティ
変更がまだ反映(書き込み)されていないデータのこと。
「コピーの方は変更されているが、元データには反映されていない」という状態を
「ダーティである」という。
ダーティなデータがキャッシュに貯まると、I/Oをさばけなくなる。
・ 待ち行列
分布/サービスタイム/並列度
利用率高い ⇒ 待ち時間増える
利用率低いのに、待ち時間が長い ⇒ 到着時間がバラバラになっている可能性がある。
・ プロファイラ
関数の呼び出し回数や、時間がかかっている関数などが得られる。
環境によって使用するツールが異なる。(lunuxはperf)
pstack連打でも同じような結果が得られる。
● ネットワークの解析
○ 用語
・ホップ数
通信・ネットワークにおいて、通信相手に到達するまでに経由する中継設備の数のこと
○ ポイント
・データの量より、回数で問題が起こることが多い
・各ネットワーク間の距離が遠いケースが多い
・ホップが多い
⇒ 個々の機器で掛かる時間が少なくても、全体では大きくなる
⇒ 手が開いている処理が中継器が出たりする。
● 実際の調査の流れ
○ ポイント
・情報取得のタイミングは合わせる
・ツールを使用する : Oracle Real User Experience Insight
■ パフォーマンスチューニング
何かを変えると他の何かも変わる。
○ 再利用
一度得たデータをキープし、DBへの問い合わせを減らすなど。
・コネクションプール
・キープアライブ
・PreparedStatement
○ 集約処理(ピギーバック)
隣り合ったブロックにまとめて書く。
ログのまとめ書き。
大量処理になり、問題を起こすことも。
○ スケールアウトとスケールアップ
・スケールアウト
サーバを増やす。
・スケールアップ
サーバの性能を上げる
○ 参照頻度の高いデータは近くに置く
○ 同期
・同期処理
相手の処理が終わるまで待つ。
・非同期処理(ASYNC)
相手の処理が終わるのを待たない。
相手の処理中に別の処理を行う。
・Ajax(Asynchronous JavaScript + XML)
ユーザが入力している間に、サーバと通信して情報や画面を表示させる。
ページ全体をロードせず、処理結果を得られる。
○ ロック
ロックを使うと、ソースコードがシンプルになる。
ロックを使うと、他の処理が止まってしまう。
大量の処理でロックを使うと、トラブルが発生する。
・楽観的ロック
テーブルにもたせている更新タイムスタンプや、
更新フラグを比較してロックする。
競合が判明した場合、ロールバックする。
他者は そうそう同じリソースに変更を加えないだろう、という楽観的な視点に基づく。
・悲観ロック
通常のロック。
他者が同じリソースに頻繁に変更を加えること前提の悲観的視点での排他制御。
更新系において、参照時に参照リソースにロックをかけ、
新しいリソースの挿入完了時にロックをはずす手法。
・BKL(Big Kernel Lock) : Linuxのロック
・synchronized : javaのロックの一つ
○ ジャンボフレーム
イーサネットの1パケットの制限を1500バイトに大きくしたパケットに関する技術。
○ ロードバランサ(負荷分散)
サーバの状況をチェックし、負荷(接続数)の低い危機に割り振る
○ アフィニティー(バインド)
関係付ける、限定する
局所性(偏り)を優先する技術。
同じプロセスは同じCPUコアで動かすなど。
ラウンドロビンの反対に位置する技術。
一部のCPUだけ負荷が上がることもあり、vmstatだとわからない。
mpstatで各CPUの処理を得ると有効。
Stickyセッション
プロセスのクッキー情報などからセッションごとに分ける。
同一セッションの場合、前回と同じサーバに送るようにする。
○ Copy On Write
上書き時にコピー。
上書きが発生したにコピーを行う手法。
直ちにコピーを行わないことで(上書きされるまでの間)
無駄な容量やプロセスが発生しない。
○ カラムナデータベース
列指向のデータベース。
列方向にデータをまとめている。
特定の列の値をまとめて処理しやすい。
テーブルから商品名と価格だけを抜き出す処理などは非常に得意。
逆に、特定の行を抜き出して更新したり削除したりするのは苦手。
■ パフォーマンステスト
● パフォーマンステスト作成の考慮事項
テストには色々と時間が掛かる。
○ 試験環境
○ 監視設定
○ スクリプト
1週間かかっても1本もできないこともある。
○ テストの実施
1回で30分から1時間
データのまとめなども含めると一日3回ぐらいしかできない。
○ 評価、ボトルネックの切り分け
ボトルネックの切り分けができず、リリースができないこともある。
○ レポートの作成
グラフ化や文書化などかなり時間が掛かる。
○ テスト環境のリセット
DBのリカバリを行う仕組みが必要。
○ シンクタイム
ユーザーが思考する時間。
● パフォーマンステスト
リリース判定を行うテスト。
・スループット
・レスポンスタイム
・同時利用数
● 限界テスト(最低、最大)
・最低
目標の水準に達しているかどうかを確認するテスト。
厳密なリソースの計測は行わず、想定の処理件数がさばけているか確認。
・最大
目標の水準を超えた負荷が来た場合に、システムが耐えらる上限や、その際の現象を把握するテスト。
● 縮退テスト
一部のシステムを停止させた状態で行うテスト。
想定されたパフォーマンスが出るか確認する。
エラーログやパフォーマンスをスループット、
挙動の変化をレスポンスタイムなどを見る。
● 障害テスト
障害を発生させて、その際のシステムの挙動を確認。
エラーログやスループット、レスポンスタイムなどを見る。
● 基盤パフォーマンステスト
アプリと基盤を切り離して行う基盤のテスト。
帯域幅や、スループット、同時利用数、同時コネクション数などを計測。
● アプリ単体パフォーマンステスト
● 耐久テスト
長時間の稼働を行う障害テストの一種。
エラーや、メモリリーク、ログの過剰蓄積がないか確認する。
・ビジー率
全体時間に対してどれくらいの時間ビジー(稼働)しているか
・使用率
全容量に対して、どれくらいの容量を使用しているか
■ 仮想化
● ホストOS型
OSに仮想ソフトをインストールする。
● ハイパーバイザ
ハードウェアのBIOSから直接、仮想ソフト(ハイパーバイザ)を起動する。
ハードウェアがないため、動作速度を抑えられる?
・完全仮想化
ゲストOSからの特権命令をハイパーバイザの機能で変換するタイプ。
・準仮想化
専用のゲストOSを使用するため、変換処理が必要ない。
高速だが、対応するOSが限られる。
○ CPUの単位
・ソケット
物理的なCPUの単位。
・コア
CPUのパーツを仕事をする部分を分けたもの。
・スレッド
実行単位。
ハイパースレッディングという技術により、
コアの待機中の時間を有効活用し、2つの仕事を並行に実行し、1つのコアを2つのスレッドに分割できる。
処理能力が1.2倍程向上する。
○ オーバーコミットとそれを実現させる技術
実際の物理リソースのキャパシティを超える仮想リソースを仮想マシンに割り当てること
CPUスケジューラがVMからの要求に応じて、VMに割り当てるCPUを切り替えているので、リソースを超えても割り当てることが可能になる。
オーバーコミットによってパフォーマンスに問題を来すこともある。
・メモリバルーニング(回収)
メモリの動的追加。
仮想マシンのメモリ割り当てを増減させる場合、
通常は仮想マシンを停止した上で行わなければならない。
仮想マシンを起動したまま、
動的にメモリの割当を変更するするのがメモリバルーニング。
・メモリ圧縮
・スワップ