内容紹介
システムパフォーマンス分析の基礎知識や方法論を学ぶ!
本書はLinuxとSolarisベースのOSに含まれるツール、サンプル、チューニング可能なパラメータを使い、システムパフォーマンスについて学ぶ書籍です。パフォーマンス分析の基礎知識と方法論に重点をおいて解説し、CPU、メモリ、ディスク、ネットワーク、クラウドコンピューティングの仕組みからシステム、キャパシティプランニング、ボトルネックの除去やスケーラビリティ分析の評価のためのベンチマークまで、網羅的に取り扱う教科書的な一冊です。
このような方におすすめ
学生、パフォーマンスエンジニア、データベース管理者、Webサーバ管理者
目次
詳細目次
目次
まえがき
1章 イントロダクション
1.1 システムパフォーマンス
1.2 職種
1.3 作業
1.4 視点
1.5 パフォーマンスエンジニアリングの難しさと面白さ
1.5.1 パフォーマンスは主観的な判断である
1.5.2 システムは複雑である
1.5.3 複数のパフォーマンス問題が同時に起きる場合がある
1.6 レイテンシ
1.7 動的トレーシング
1.8 クラウドコンピューティング
1.9 ケーススタディ
1.9.1 ディスクの速度低下
1.9.2 ソフトウェア変更
1.9.3 より深く学ぶために
2章 メソドロジ
2.1 用語
2.2 モデル
2.2.1 テスト対象システム(SUT)
2.2.2 キューイングシステム
2.3 コンセプト
2.3.1 レイテンシ
2.3.2 タイムスケール
2.3.3 トレードオフ
2.3.4 チューニング
2.3.5 適切性の水準
2.3.6 基準時の推奨値
2.3.7 負荷かアーキテクチャか
2.3.8 スケーラビリティ
2.3.9 Known-Unknowns
2.3.10 パフォーマンス指標
2.3.11 使用率
2.3.12 飽和
2.3.13 プロファイリング
2.3.14 キャッシング
2.4 視点
2.4.1 リソース分析
2.4.2 ワークロード分析
2.5 メソドロジ
2.5.1 街灯のアンチメソッド
2.5.2 ランダム変更アンチメソッド
2.5.3 誰か他人のせいにするアンチメソッド
2.5.4 アドホックチェックリストメソッド
2.5.5 問題の記述
2.5.6 科学的メソッド
2.5.7 診断サイクル
2.5.8 ツールメソッド
2.5.9 USEメソッド
2.5.10 ワークロードの特性の把握
2.5.11 ドリルダウン分析
2.5.12 レイテンシ分析
2.5.13 メソッドR
2.5.14 イベントトレーシング
2.5.15 ベースライン統計
2.5.16 静的パフォーマンスチューニング
2.5.17 キャッシュチューニング
2.5.18 マイクロベンチマーキング
2.6 モデリング
2.6.1 エンタープライズシステム対クラウドシステム
2.6.2 視覚的な究明
2.6.3 Amdahlのスケーラビリティ法則
2.6.4 スケーラビリティの普遍法則
2.6.5 待ち行列理論
2.7 キャパシティプランニング
2.7.1 リソースの限界
2.7.2 要素分析
2.7.3 スケーラビリティを向上させる方法
2.8 統計
2.8.1 パフォーマンスの定量化
2.8.2 平均
2.8.3 標準偏差、パーセンタイル、中央値
2.8.4 変動係数
2.8.5 多峰分布
2.8.6 外れ値
2.9 モニタリング
2.9.1 時系列的なパターン
2.9.2 モニタリング製品
2.9.3 ブート以降の集計
2.10 ビジュアライゼーション
2.10.1 折れ線グラフ
2.10.2 散布図
2.10.3 ヒートマップ
2.10.4 表面プロット
2.10.5 ビジュアライゼーションツール
2.11 練習問題
2.12 参考文献
3章 オペレーティングシステム
3.1 用語
3.2 基礎知識
3.2.1 カーネル
3.2.2 スタック
3.2.3 割り込みと割り込みスレッド
3.2.4 割り込み優先レベル
3.2.5 プロセス
3.2.6 システムコール
3.2.7 仮想メモリ
3.2.8 メモリ管理
3.2.9 スケジューラ
3.2.10 ファイルシステム
3.2.11 キャッシング
3.2.12 ネットワーク
3.2.13 デバイスドライバ
3.2.14 マルチプロセッサ
3.2.15 プリエンプション
3.2.16 リソース管理
3.2.17 可観測性
3.3 カーネル
3.3.1 Unix
3.3.2 Solarisベースシステム
3.3.3 Linuxベースシステム
3.3.4 違い
3.4 練習問題
3.5 参考文献
4章 可観測性ツール
4.1 ツールのタイプ
4.1.1 カウンタ
4.1.2 トレーシング
4.1.3 プロファイリング
4.1.4 モニタリング(sar)
4.2 可観測性ツールの情報ソース
4.2.1 /proc
4.2.2 /sys
4.2.3 kstat
4.2.4 遅延アカウンティング
4.2.5 マイクロステートアカウンティング
4.2.6 その他の可観測性ツールの情報ソース
4.3 DTrace
4.3.1 静的トレーシングと動的トレーシング
4.3.2 プローブ
4.3.3 プロバイダ
4.3.4 引数
4.3.5 D言語
4.3.6 組み込み変数
4.3.7 アクション
4.3.8 変数の型
4.3.9 1行プログラム
4.3.10 スクリプティング
4.3.11 オーバーヘッド
4.3.12 ドキュメントと参考資料
4.4 SystemTap
4.4.1 プローブ
4.4.2 タップセット
4.4.3 アクションと組み込み変数
4.4.4 サンプル
4.4.5 オーバーヘッド
4.4.6 ドキュメントと参考資料
4.5 perf
4.6 可観測性の観測
4.7 練習問題
4.8 参考文献
5章 アプリケーション
5.1 アプリケーションの基礎
5.1.1 パフォーマンスの目標
5.1.2 よく実行されるコードの最適化
5.1.3 可観測性
5.1.4 ビッグオー記法
5.2 アプリケーションのパフォーマンス向上のためのテクニック
5.2.1 I/Oサイズの選択
5.2.2 キャッシング
5.2.3 バッファリング
5.2.4 ポーリング
5.2.5 並行/並列処理
5.2.6 ノンブロッキングI/O
5.2.7 プロセッサのバインド
5.3 プログラミング言語
5.3.1 コンパイル言語
5.3.2 インタープリタ言語
5.3.3 仮想マシン
5.3.4 ガベージコレクション
5.4 メソドロジと分析
5.4.1 スレッドの状態の分析
5.4.2 CPUのプロファイリング
5.4.3 システムコールの分析
5.4.4 I/Oのプロファイリング
5.4.5 ワークロードの特性の把握
5.4.6 USEメソッド
5.4.7 ドリルダウン分析
5.4.8 ロック分析
5.4.9 静的パフォーマンスチューニング
5.5 練習問題
5.6 参考文献
6章 CPU
6.1 用語
6.2 モデル
6.2.1 CPUアーキテクチャ
6.2.2 CPUのメモリキャッシュ
6.2.3 CPUのランキュー
6.3 コンセプト
6.3.1 クロックスピード
6.3.2 命令
6.3.3 命令パイプライン
6.3.4 命令幅
6.3.5 CPI、IPC
6.3.6 使用率
6.3.7 ユーザー時間/カーネル時間
6.3.8 飽和
6.3.9 プリエンプション
6.3.10 優先度の逆転
6.3.11 マルチプロセスとマルチスレッディング
6.3.12 ワードサイズ
6.3.13 コンパイラの最適化
6.4 アーキテクチャ
6.4.1 ハードウェア
6.4.2 ソフトウェア
6.5 メソドロジ
6.5.1 ツールメソッド
6.5.2 USEメソッド
6.5.3 ワークロードの特性の把握
6.5.4 プロファイリング
6.5.5 サイクル分析
6.5.6 パフォーマンスモニタリング
6.5.7 静的パフォーマンスチューニング
6.5.8 優先度のチューニング
6.5.9 リソースコントロール
6.5.10 CPUのバインド
6.5.11 マイクロベンチマーキング
6.5.12 スケーリング
6.6 分析
6.6.1 uptime
6.6.2 vmstat
6.6.3 mpstat
6.6.4 sar
6.6.5 ps
6.6.6 top
6.6.7 prstat
6.6.8 pidstat
6.6.9 time、ptime
6.6.10 DTrace
6.6.11 SystemTap
6.6.12 perf
6.6.13 cpustat
6.6.14 その他のツール
6.6.15 ビジュアライゼーション
6.7 実験
6.7.1 アドホックテスト
6.7.2 SysBench
6.8 チューニング
6.8.1 コンパイラオプション
6.8.2 優先度とクラスの操作
6.8.3 スケジューラオプション
6.8.4 プロセスのバインド
6.8.5 排他的CPUセット
6.8.6 リソースコントロール
6.8.7 プロセッサオプション(BIOSチューニング)
6.9 練習問題
6.10 参考文献
7章 メモリ
7.1 用語
7.2 コンセプト
7.2.1 仮想メモリ
7.2.2 ページング
7.2.3 デマンドページング
7.2.4 オーバーコミット
7.2.5 スワッピング
7.2.6 ファイルシステムキャッシュ
7.2.7 使用率と飽和
7.2.8 アロケータ
7.2.9 ワードサイズ
7.3 アーキテクチャ
7.3.1 ハードウェア
7.3.2 ソフトウェア
7.3.3 プロセスのアドレス空間
7.4 メソドロジ
7.4.1 ツールメソッド
7.4.2 USEメソッド
7.4.3 使用形態の特性の把握
7.4.4 サイクル分析
7.4.5 パフォーマンスモニタリング
7.4.6 リーク検出
7.4.7 静的パフォーマンスチューニング
7.4.8 リソースコントロール
7.4.9 マイクロベンチマーキング
7.5 分析
7.5.1 vmstat
7.5.2 sar
7.5.3 slabtop
7.5.4 ::kmastat
7.5.5 ps
7.5.6 top
7.5.7 prstat
7.5.8 pmap
7.5.9 DTrace
7.5.10 SystemTap
7.5.11 その他のツール
7.6 チューニング
7.6.1 チューニング可能なパラメータ
7.6.2 複数のページサイズ
7.6.3 アロケータ
7.6.4 リソースコントロール
7.7 練習問題
7.8 参考文献
8章 ファイルシステム
8.1 用語
8.2 モデル
8.2.1 ファイルシステムインターフェイス
8.2.2 ファイルシステムキャッシュ
8.2.3 2次キャッシュ
8.3 コンセプト
8.3.1 ファイルシステムレイテンシ
8.3.2 キャッシング
8.3.3 ランダムI/OとシーケンシャルI/O
8.3.4 プリフェッチ
8.3.5 先読み
8.3.6 キャッシュの書き戻し
8.3.7 同期書き込み
8.3.8 Raw I/OとDirect I/O
8.3.9 ノンブロッキングI/O
8.3.10 メモリマップトファイル
8.3.11 メタデータ
8.3.12 論理I/Oと物理I/O
8.3.13 オペレーションは平等ではない
8.3.14 特殊なファイルシステム
8.3.15 アクセスタイムスタンプ
8.3.16 容量
8.4 アーキテクチャ
8.4.1 ファイルシステムI/Oスタック
8.4.2 VFS
8.4.3 ファイルシステムキャッシュ
8.4.4 ファイルシステムの機能
8.4.5 ファイルシステムのタイプ
8.4.6 ボリュームとプール
8.5 メソドロジ
8.5.1 ディスクの分析
8.5.2 レイテンシの分析
8.5.3 ワークロードの特性の把握
8.5.4 パフォーマンスモニタリング
8.5.5 イベントトレーシング
8.5.6 静的パフォーマンスチューニング
8.5.7 キャッシュチューニング
8.5.8 ワークロードの分離
8.5.9 メモリベースのファイルシステム
8.5.10 マイクロベンチマーキング
8.6 分析
8.6.1 vfsstat
8.6.2 fsstat
8.6.3 strace、truss
8.6.4 DTrace
8.6.5 SystemTap
8.6.6 LatencyTOP
8.6.7 free
8.6.8 top
8.6.9 vmstat
8.6.10 sar
8.6.11 slabtop
8.6.12 mdb::kmastat
8.6.13 fcachestat
8.6.14 /proc/meminfo
8.6.15 mdb::memstat
8.6.16 kstat
8.6.17 その他のツール
8.6.18 ビジュアライゼーション
8.7 実験
8.7.1 アドホックテスト
8.7.2 マイクロベンチマークツール
8.7.3 キャッシュのフラッシング
8.8 チューニング
8.8.1 アプリケーションレベルの呼び出し
8.8.2 ext3
8.8.3 ZFS
8.9 練習問題
8.10 参考文献
9章 ディスク
9.1 用語
9.2 モデル
9.2.1 シンプルディスク
9.2.2 キャッシングディスク
9.2.3 コントローラ
9.3 コンセプト
9.3.1 計測時間
9.3.2 タイムスケール
9.3.3 キャッシング
9.3.4 ランダムI/OとシーケンシャルI/O
9.3.5 読み書きの割合
9.3.6 I/Oの規模
9.3.7 IOPSは等しくない
9.3.8 データ転送以外のディスクコマンド
9.3.9 使用率
9.3.10 飽和
9.3.11 I/O待ち時間
9.3.12 同期I/Oと非同期I/O
9.3.13 ディスクI/OとアプリケーションI/O
9.4 アーキテクチャ
9.4.1 ディスクのタイプ
9.4.2 インターフェイス
9.4.3 ストレージタイプ
9.4.4 オペレーティングシステムのディスクI/Oスタック
9.5 メソドロジ
9.5.1 ツールメソッド
9.5.2 USEメソッド
9.5.3 パフォーマンスモニタリング
9.5.4 ワークロードの特性の把握
9.5.5 レイテンシ分析
9.5.6 イベントトレーシング
9.5.7 静的パフォーマンスチューニング
9.5.8 キャッシュチューニング
9.5.9 リソースコントロール
9.5.10 マイクロベンチマーキング
9.5.11 スケーリング
9.6 分析
9.6.1 iostat
9.6.2 sar
9.6.3 pidstat
9.6.4 DTrace
9.6.5 SystemTap
9.6.6 perf
9.6.7 iotop
9.6.8 iosnoop
9.6.9 blktrace
9.6.10 MegaCli
9.6.11 smartctl
9.6.12 ビジュアライゼーション
9.7 実験
9.7.1 アドホックテスト
9.7.2 カスタムロードジェネレータ
9.7.3 マイクロベンチマークツール
9.7.4 ランダム読み出しの例
9.8 チューニング
9.8.1 オペレーティングシステムのチューニング可能パラメータ
9.8.2 ディスクデバイスのチューニング可能パラメータ
9.8.3 ディスクコントローラのチューニング可能パラメータ
9.9 練習問題
9.10 参考文献
10章 ネットワーク
10.1 用語
10.2 モデル
10.2.1 ネットワークインターフェイス
10.2.2 コントローラ
10.2.3 プロトコルスタック
10.3 コンセプト
10.3.1 ネットワークとルーティング
10.3.2 プロトコル
10.3.3 カプセル化
10.3.4 パケットサイズ
10.3.5 レイテンシ
10.3.6 バッファリング
10.3.7 接続バックログ
10.3.8 インターフェイスのネゴシエーション
10.3.9 使用率
10.3.10 ローカル接続
10.4 アーキテクチャ
10.4.1 プロトコル
10.4.2 ハードウェア
10.4.3 ソフトウェア
10.5 メソドロジ
10.5.1 ツールメソッド
10.5.2 USEメソッド
10.5.3 ワークロードの特性の把握
10.5.4 レイテンシ分析
10.5.5 パフォーマンスモニタリング
10.5.6 パケットスニッフィング
10.5.7 TCP分析
10.5.8 ドリルダウン分析
10.5.9 静的パフォーマンスチューニング
10.5.10 リソースコントロール
10.5.11 マイクロベンチマーキング
10.6 分析
10.6.1 netstat
10.6.2 sar
10.6.3 ifconfig
10.6.4 ip
10.6.5 nicstat
10.6.6 dladm
10.6.7 ping
10.6.8 traceroute
10.6.9 pathchar
10.6.10 tcpdump
10.6.11 snoop
10.6.12 Wireshark
10.6.13 DTrace
10.6.14 SystemTap
10.6.15 perf
10.6.16 その他のツール
10.7 実験
10.7.1 iperf
10.8 チューニング
10.8.1 Linux
10.8.2 Solaris
10.8.3 構成
10.9 練習問題
10.10 参考文献
11章 クラウドコンピューティング
11.1 基礎知識
11.1.1 価格/パフォーマンス比
11.1.2 スケーラブルなアーキテクチャ
11.1.3 キャパシティプランニング
11.1.4 マルチテナンシー
11.2 OS仮想化
11.2.1 オーバーヘッド
11.2.2 リソースコントロール
11.2.3 可観測性
11.3 ハードウェア仮想化
11.3.1 オーバーヘッド
11.3.2 リソースコントロール
11.3.3 デバイスI/O
11.3.4 可観測性
11.4 比較
11.5 練習問題
11.6 参考文献
12章 ベンチマーキング
12.1 基礎知識
12.1.1 アクティビティ
12.1.2 効果的なベンチマーキング
12.1.3 ベンチマーキングの禁じ手
12.2 ベンチマーキングのタイプ
12.2.1 マイクロベンチマーキング
12.2.2 シミュレーション
12.2.3 リプレイ
12.2.4 産業標準
12.3 メソドロジ
12.3.1 パッシブベンチマーキング
12.3.2 アクティブベンチマーキング
12.3.3 CPUプロファイリング
12.3.4 USEメソッド
12.3.5 ワークロードの特性の把握
12.3.6 カスタムベンチマーク
12.3.7 ランプロード
12.3.8 サニティチェック
12.3.9 統計的分析
12.4 ベンチマークについての問い
12.5 練習問題
12.6 参考文献
13章 ケーススタディ
13.1 ケーススタディ:赤いクジラ
13.1.1 問題の記述
13.1.2 サポート
13.1.3 作業開始
13.1.4 冒険は自分で選べ
13.1.5 USEメソッド
13.1.6 これで終わりなのか
13.1.7 テイク2
13.1.8 基礎
13.1.9 赤いクジラを無視する
13.1.10 カーネルに対する問い合わせ
13.1.11 なぜか?
13.1.12 エピローグ
13.2 コメント
13.3 その他の情報
13.4 参考文献
付録A USEメソッド:Linux
A.1 物理リソース
A.2 ソフトウェアリソース
付録B USEメソッド:Solaris
B.1 物理リソース
B.2 ソフトウェアリソース
B.3 参考文献
付録C sarのまとめ
C.1 Linux
C.2 Solaris
付録D DTrace 1行プログラム
D.1 syscallプロバイダ
D.2 procプロバイダ
D.3 profileプロバイダ
D.4 schedプロバイダ
D.5 fbtプロバイダ
D.6 pidプロバイダ
D.7 ioプロバイダ
D.8 sysinfoプロバイダ
D.9 vminfoプロバイダ
D.10 ipプロバイダ
D.11 tcpプロバイダ
D.12 udpプロバイダ
付録E DTraceからSystemTapへの書き換え
E.1 機能
E.2 用語
E.3 プローブ
E.4 組み込み変数
E.5 関数
E.6 例1:syscall entryプローブのリストアップ
E.7 例2:read()が返したサイズの集計
E.8 例3:プロセス名ごとにシステムコールを集計する
E.9 例4:プロセスID 123が呼び出しているシステムコールを名前ごとに集計する
E.10 例5:"httpd"プロセスが呼び出しているシステムコールの数を名前ごとに集計する
E.11 例6:open()をトレーシングしてプロセス名とパス名を表示する
E.12 例7:"mysqld"プロセスのread()レイテンシを集計する
E.13 例8:プロセス名と引数を付けて新プロセスをトレーシングする
E.14 例9:カーネルスタックを100Hzでサンプリングする
付録F 練習問題の解答
F.1 2章「メソドロジ」
F.2 3章「オペレーティングシステム」
F.3 6章「CPU」
F.4 7章「メモリ」
F.5 8章「ファイルシステム」
F.6 9章「ディスク」
F.7 11章「クラウドコンピューティング」
付録G システムパフォーマンス関連の著名人リスト
付録H 用語集
参考文献
索引
続きを見る