詳解 システム・パフォーマンス

[cover photo]
TOPICS
System/Network
発行年月日
PRINT LENGTH
784
ISBN
978-4-87311-790-4
原書
Systems Performance
FORMAT
PDF EPUB

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

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第1刷正誤表


※2刷以降では修正済み

■P.vi 上から2行目
【誤】Fedra
【正】Fedora

■P.viii 上から11行目
【誤】RAIDING
【正】RAID

■P.ix 下から9行目
【誤】学習のために避ける
【正】学習のために割ける

■P.91 上から4行目
【誤】(たし、
【正】(ただし、

■P.100 下から7行目
【誤】NFS(NetWork File System)
【正】NFS(Network File System)

■P.102 上から1行目
【誤】パオフォーマンス
【正】パフォーマンス

■P.107 上から15行目
【誤】NFS(NetWork File System)
【正】NFS(Network File System)

■P.158 上から12行目
【誤】チューイング
【正】チューニング

■P.174 下から11行目
【誤】ロックの回想
【正】ロックの階層

■P.350 下から5行目
【誤】Intel Xeon 24GHz
【正】Intel Xeon 2.4GHz

■P.368 下から6行目
【誤】RAIDO
【正】RAID

■P.459 下から7行目
【誤】表示されません。
【正】表示されない。

■P.508 下から5行目
【誤】loalhost
【正】localhost

■P.517 下から8行目
【誤】使用します。
【正】使用する。

■P.540 上から5行目
【誤】Solarsi
【正】Solaris

■P.593 上から9行目
【誤】SWAP:ゾーン名。
【正】ZONE:ゾーン名。

■P.596 下から7行目
【誤】スタンドアローンシステムように
【正】スタンドアローンシステム用に

■P.623 上から15行目
【誤】price/performance ration
【正】price/performance ratio

■P.627 上から3行目
【誤】ディスクパフォーアンス
【正】ディスクパフォーマンス

■P.634 上から13行目
【誤】Dyrystone
【正】Dhrystone

■P.651 上から7行目
【誤】エクスパート
【正】エキスパート

目次

目次
まえがき

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 用語集

参考文献
索引