詳解 システム・パフォーマンスの輪読会がしたい

概要

原書: Systems Performanceを読みました。目次だけで1万文字を超えていてビビります。 輪読会をやりたいとゴネてても仕方ないので自分で主催することにしました。 そこで各章のリンクページを作りました。最終章をやるころには何処で何をしているのか…。

本書の概要

エンタープライズ環境とクラウド環境の両方を対象としたオペレーティングシステムおよびオペレーティングシステムのコンテキストにおけるアプリケーションのパフォーマンス分析と向上について解説します。主にLinuxSolarisベースのオペレーティングシステムに含まれるツールとその使用例やチューニング可能パラメータの設定を通じてシステムパフォーマンスを引き出す手法を学びます。CPUやメモリ、ファイルシステムなど個別テーマごとに設けられた各章の前半では、用語、考え方、方法論について述べ、後半では実装の具体例を示しつつ、アーキテクチャ、分析ツール、チューニングなどを解説しています。システムの問題点を洗い出すための知識や、チューニングの実例を学ぶ、システム管理者必携の一冊です。

目次

 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 参考文献