Webシステムが主流となりつつある昨今、急激なアクセス増加や高負荷処理にも耐え、パフォーマンスを維持できるシステム作りが求められています。しかし、パフォーマンスの考え方は一朝一夕に身につけられるものではなく、開発・運用現場で長年の経験を積んだ末にノウハウと共に得られるものです。
本書は、開発・運用の現場で多くの案件を経験してきたベテランのコンサルタントたちが、その経験から得られたノウハウとともに、システムパフォーマンスの基礎をわかりやすく解説するものです。
パフォーマンスの概念から、分析方法、チューニングの考え方、実際の製品を想定したパフォーマンスまで、幅広く取り上げます。理論だけでなく、実例を挙げながら解説するので、実践的な知識を得ることができます。また、パフォーマンスはシステムアーキテクチャと密接につながっているため、パフォーマンスを学びながら、システムアーキテクチャを効率的に学ぶこともできます。本書では、Web3階層やバッチ処理に加え、仮想化環境やクラウド環境を扱います。
【第1章】パフォーマンスの基礎的な考え方
1.1 パフォーマンスを学ぶために必要なこと
1.2 アルゴリズムのメリット/デメリットと学習法
1.2.1 アルゴリズムとは
1.2.2 アルゴリズムの根幹
1.2.3 アルゴリズムを学ぶコツ
1.3 アルゴリズムの実例とパフォーマンスの違い
1.3.1 身近にあるアルゴリズムの例
1.3.2 パフォーマンスへの影響度合い
1.3.3 アルゴリズムを評価する指標
1.4 レスポンスとスループットの違い
1.5 アルゴリズムの具体例
1.5.1 配列とループ処理
1.5.2 リストとループ処理
1.5.3 ツリーと探索
1.5.4 ハッシュアルゴリズム
1.5.5 キュー
1.5.6 スタック
1.5.7 ソート(Quickソート)
1.5.8 キャッシュ(1)(ライトバック:write back)
1.5.9 キャッシュ(2)(ライトスルー:write through)
1.5.10 ロックとパフォーマンス
【第2章】パフォーマンス分析の基本
2.1 パフォーマンスの第一歩は測定から
2.2 必要なパフォーマンス情報とは
2.2.1 「はさみうち」の原則
2.2.2 パフォーマンス情報の3種類
2.2.3 システムのモデルとパフォーマンストラブル時の動き
2.2.4 データの種類と分析のコツ
2.3 パフォーマンス分析で重要な理論
2.3.1 待ち行列理論の用語
2.3.2 待ち行列の平均待ち時間を計算する
2.3.3 使用率と待ち行列の例
2.3.4 実際にどのような情報を取得するのか
2.4 OSのコマンド
2.4.1 sar
2.4.2 vmstat
2.4.3 ps
2.4.4 netstat
2.4.5 iostat
2.4.6 top
2.4.7 パケットダンプ(wireshark、tcpdumpなど)
2.4.8 pstack
2.4.9 システムコール(straceなど)
2.4.10 プロファイラ
2.4.11 Windowsの場合
【第3章】実システムのパフォーマンス分析
3.1 Web/APサーバとJava/Cアプリ
3.1.1 Webサーバのアクセスログ
3.1.2 アプリ/APサーバのログ
3.2 DBサーバのパフォーマンス測定
3.2.1 DBMSのパフォーマンス測定のセオリー
3.2.2 パフォーマンス分析の仕上げ
3.3 ストレージのパフォーマンス分析の考え方
3.3.1 ストレージの用語
3.3.2 ストレージパフォーマンスの考え方――IOPSを大事にする
3.4 ネットワークのパフォーマンス分析の考え方
3.5 原因調査
3.5.1 初心者が陥りがちな罠
3.5.2 心がけるべき姿勢
3.5.3 実際の調査の流れ
【第4章】パフォーマンスチューニング
4.1 パフォーマンスとチューニング
4.1.1 現実のパフォーマンスは?
4.1.2 現場では「大局観」を持つべし
4.2 パフォーマンスチューニングの定石
4.2.1 設定は大きすぎても、小さすぎても駄目。ほどほどに
4.2.2 チューニングは1つずつ進める
4.2.3 再利用することで速くする
4.2.4 まとめて処理をする(集約、ピギーバック)
4.2.5 高速化と並列化
4.2.6 スケールアップとスケールアウト
4.2.7 局所性
4.3 現場で用いられるテクニック
4.3.1 ループの省略、キャッチボールの削減
4.3.2 参照頻度の高いデータはキーバリューストア化かハッシュ化する
4.3.3 参照頻度の高いデータは使う場所の近くに置く
4.3.4 同期を非同期に変える
4.3.5 帯域制限
4.3.6 LRU方式
4.3.7 処理の分割またはロックの粒度の詳細化
4.3.8 不揮発なライトバックのキャッシュの採用
4.3.9 マルチレイヤのキャッシュの採用
4.3.10 ジャンボフレームと高速ネットワークの採用
4.3.11 負荷分散、ラウンドロビン
4.3.12 アフィニティ、バインド、Stickyセッション
4.3.13 copy on write(COW)
4.3.14 ジャーナル、ログ
4.3.15 圧縮
4.3.16 楽観的ロック
4.3.17 カラムナデータベース(Columnar Database)
4.3.18 サーバのパフォーマンス設定は初期値=最大値?
4.4 実際の業務で遭遇するパフォーマンス
4.4.1 パフォーマンス比較の参考データ
4.4.2 キャッシュヒットは高いとは限らない
4.4.3 ストレージのチューニング方針
4.4.4 サイズは足りているのにディスクを追加する
4.4.5 パフォーマンス観点でのファイル分割
4.4.6 90パーセンタイル
4.4.7 読み込みと書き込みの割合
4.5 チューニングの例
4.5.1 例1:二重ループ中のselect文発行
4.5.2 例2:たまにパフォーマンスが劣化する
【第5章】パフォーマンステスト
5.1 パフォーマンステストの概要
5.1.1 プロジェクト工程におけるパフォーマンステスト
5.1.2 役割に応じたパフォーマンステストのかかわり方
5.2 よくある失敗:9つのアンチパターン
5.2.1 期間内に終わらない!
5.2.2 パフォーマンスが出ない! パフォーマンス問題が解決できない!
5.2.3 環境差異を考慮しないために問題が発生
5.2.4 負荷シナリオ設計に不備があるために問題が発生
5.2.5 バッファ/キャッシュの利用を考慮しないために問題が発生
5.2.6 シンクタイムを考慮しないために問題が発生
5.2.7 報告内容が理解できずお客様が納得しない
5.2.8 不信感により、お客様が納得しない
5.2.9 テストに時間がかかる
5.3 パフォーマンステストの種類
5.3.1 実施のサイクル
5.3.2 狭義のパフォーマンステスト
5.3.3 限界テスト(限界パフォーマンス、縮退パフォーマンス、障害テスト)
5.3.4 基盤パフォーマンステスト
5.3.5 アプリ単体パフォーマンステスト
5.3.6 耐久テスト
5.3.7 隣接分野
5.4 プロジェクト工程で考えるパフォーマンステスト
5.4.1 要件定義
5.4.2 プロジェクト企画
5.4.3 【基本設計】システム選定
5.4.4 【基本設計】パフォーマンステスト環境
5.4.5 【基本設計】その他、パフォーマンス設計に関して決めること
5.4.6 【パフォーマンステスト設計】テストスケジュール詳細
5.4.7 【パフォーマンステスト設計】人員手配と連絡体制
5.4.8 【基盤結合テスト】基盤パフォーマンステスト
5.4.9 【結合テスト】多重実行テスト
5.4.10 【総合テスト】負荷テスト、限界テスト、耐久テスト
5.4.11 【運用テスト】パフォーマンス監視テスト、障害テスト
5.4.12 【納品】パフォーマンステスト結果の検収報告
5.4.13 【運用】初期稼働確認
5.5 パフォーマンステストの課題と必要ノウハウ
5.5.1 パフォーマンス見積もり能力
5.5.2 効率的な繰り返し実施能力
5.5.3 Oracle Application Testing Suite使用の効果
【第6章】仮想化環境におけるパフォーマンス
6.1 仮想化とパフォーマンス
6.2 仮想化概要
6.2.1 サーバ仮想化とは?
6.2.2 仮想化の種類
6.3 サーバ仮想化の主な技術(オーバコミット)
6.3.1 CPUの仮想化技術
6.3.2 メモリの仮想化技術
6.4 仮想化環境のパフォーマンスの考え方と分析方法
6.4.1 パフォーマンス分析に使用するツール
6.4.2 CPUのパフォーマンス管理
6.4.3 メモリのパフォーマンス管理
6.4.4 ストレージのパフォーマンス管理
6.4.5 ネットワークのパフォーマンス管理
【第7章】クラウド環境におけるパフォーマンス
7.1 クラウド環境におけるパフォーマンスの考え方
7.1.1 クラウド環境になるとパフォーマンスが遅くなるのか?
7.2 クラウドとオンプレミスの違い
7.2.1 クラウドの定義
7.2.2 クラウドの特徴から見るオンプレミス環境からの変更点
7.2.3 クラウドの実装形態
7.2.4 クラウドのサービス提供形態から見るオンプレミス環境との違い
7.2.5 リソースの変動要素と固定要素の見極め
7.3 クラウド環境の内部構造と最適なアプリケーション方式
7.3.1 集約か? 分散か?
7.3.2 密結合か? 疎結合か?
7.3.3 SOAPか? RESTか?
7.3.4 フロントの分散化:ネットワークアクセスの方法
7.3.5 バックエンドの分散化:データストアの考え方(ACIDからBASEへ)
7.3.6 TCP通信の高速化
7.3.7 オブジェクトストレージの高速化
7.3.8 C言語か? Java言語か? スクリプト言語か?
7.3.9 クラウド環境でのハイパフォーマンスサービスのアーキテクチャ
7.3.10 オープンマイグレーションとクラウドマイグレーション
7.3.11 クラウドの内部構成を推察してみる
7.4 クラウド環境におけるパフォーマンス分析の仕方
7.4.1 クラウド環境のベンチマーク取得の価値と常に進化するパフォーマンス値
7.4.2 Webシステムでの基本的な分析アプローチ
7.4.3 バッチシステムでの基本的な分析アプローチ
7.4.4 クラウドの自動拡張機能
7.4.5 クラウド環境のばらつきを解析する統計的アプローチ
7.5 クラウド環境での開発フェーズのアプローチ
7.5.1 サイジング(基本設計)
7.5.2 パフォーマンステスト(総合テスト)
7.5.3 プロジェクトマネージメント
7.6 クラウド環境での運用フェーズのアプローチ
7.6.1 キャパシティ管理
7.6.2 障害発生時の縮退キャパシティ運用
7.6.3 ライフサイクルとリプレース
COLUMN
情報科学を学ぶことの大事さ
インフラエンジニアがプログラミングを学ぶ重要性
DBMSはデータ構造とアルゴリズムの宝庫
【上級編】ロックの仕組みはどうやって実装されているのか
【上級編】正常系だけじゃないんだよ。パフォーマンスというものは!
パフォーマンスは定期的に確認すべきか
時刻同期は大事
バッチのパフォーマンス測定
パフォーマンストラブルデータはどれくらいの期間記録しておくべき?
各種パフォーマンス情報取得のタイミングは合わせる? 合わせない?
パフォーマンス分析の夢のツール?
コンパイラはRDBMSと同じ道を歩むのか?
待ち行列の先頭は何をしているのか?
ハードウェア支援機能
DRS、まだ使ってないの?
待ち時間感度(Latency-Sensitivity)機能
クラウドコンピューティングが実現する究極のグローバリゼーション
ハイブリッド構成のコスト管理は、リアルオプションを駆使したポートフォリオマネージメント
クラウドでは損益分岐点を常にプラス化できる(独自SaaS提供に最適なコストモデル)
抽象化されるクラウド環境をとらえられるアメリカ人――絵とイメージの重要性
パフォーマンス分野は理系エンジニアの特権?
クラウド環境では、経営者も詳細なパフォーマンスデータを意識する?
閾値設定とシステム安全係数、標準化の価値とは
クラウドが実現するDevOpsにおけるパフォーマンスチューニングの効率化
まみり さん
2018-09-05
★★★★☆新しい本ではないけれど、古臭さはなく、学ぶべきことはあまり変わっていないんだなあと感じる。パフォーマンスにかかる問題にあたったときに、たしかに闇雲で手当たり次第で、だいたいあまり、特定に至らない…。一回では理解しきれなかったので、時間をおいて、また読もうと思う。
syuu0822 さん
2019-03-16
システムのパフォーマンスについて、アプリ、インフラの両方の観点から説明した本です。アプリ、インフラでどのような部分がボトルネックになるのか分かりやすく書かれています。 自分がインフラ側の人間のせいかもしれませんが、パフォーマンス問題というのは大体インフラ側に要因があり、インフラ側で解決する印象がありましたが、本書を読んでやはりそうなのだと思い至りました。 パフォーマンス解析の方法やテストの観点にも触れており、大変ためになる良書でした。
とかげ さん
2021-07-20
上司大絶賛の推薦本なのに私の理解力不足が情けなく。絵になっているのはとっつきやすかったし、後半でゆるい人アイコン見てほっとしたりしていました。アルゴリズムは基本情報技術者試験でも触れていてパフォーマンスに関わるのだなあとなりました。肝心の取り組まねばならないクラウドの性能試験については…何を見なければならないのだろう…AWSで何が見れるのか知らないことにはか。2014年からもっと変わっていることもあるだろうしうーむむ。