Skip to content

Instantly share code, notes, and snippets.

@ozaki-r
Last active February 3, 2023 06:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ozaki-r/356439eac313eb0fbf1afae54942587b to your computer and use it in GitHub Desktop.
Save ozaki-r/356439eac313eb0fbf1afae54942587b to your computer and use it in GitHub Desktop.
詳解システム・パフォーマンス 差分
まえがき
1章 イントロダクション
1.1 システムパフォーマンス
1.2 職種
1.3 作業
1.4 分析の視点
1.5 パフォーマンスエンジニアリングの難しさと面白さ
1.5.1 主観的な性質
1.5.2 複雑さ
1.5.3 複数の原因の相互作用
1.5.4 複数のパフォーマンス障害の同時発生
1.6 レイテンシ
1.7 可観測性
1.7.1 カウンタ、統計量、指標
1.7.2 プロファイリング
1.7.3 トレーシング
1.8 実験
1.9 クラウドコンピューティング
1.10 メソドロジ
1.10.1 60秒で終わるLinuxパフォーマンス分析
1.11 ケーススタディ
1.11.1 ディスクの速度低下
1.11.2 ソフトウェア変更
1.11.3 より深く学ぶために
1.12 参考文献
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 スケーラビリティ
2.3.10 パフォーマンス指標
2.3.11 使用率
2.3.12 飽和度
2.3.13 プロファイリング
2.3.14 キャッシング
2.3.15 Known-Unknowns
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 REDメソッド
2.5.11 ワークロードの特性の把握
2.5.12 ドリルダウン分析
2.5.13 レイテンシ分析
2.5.14 メソッドR
2.5.15 イベントトレーシング
2.5.16 ベースライン統計
2.5.17 静的パフォーマンスチューニング
2.5.18 キャッシュのチューニング
2.5.19 マイクロベンチマーキング
2.5.20 パフォーマンスマントラ
2.6 モデリング
2.6.1 エンタープライズシステムかクラウドシステムか
2.6.2 視覚的な究明
2.6.3 スケーラビリティに関するアムダールの法則
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.10.6 ビジュアライゼーションツール
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 BSD
3.3.3 Solaris
3.4 Linux
3.4.1 Linuxが開発したカーネル機能
3.4.2 systemd
3.4.3 KPTI(メルトダウン対策)
3.4.4 拡張BPF
3.5 その他の項目
3.5.1 PGOカーネル
3.5.2 ユニカーネル
3.5.3 マイクロカーネルとハイブリッドカーネル
3.5.4 分散OS
3.6 カーネルの比較
3.7 練習問題
3.8 参考文献
3.8.1 本文で言及していない参考文献
4章 可観測性ツール
4.1 取り上げるツール
4.1.1 静的パフォーマンスツール
4.1.2 クライシスツール
4.2 ツールタイプ
4.2.1 固定カウンタ
4.2.2 プロファイリング
4.2.3 トレーシング
4.2.4 モニタリング
4.3 可観測性ツールの情報ソース
4.3.1 /proc
4.3.2 /sys
4.3.3 遅延アカウンティング
4.3.4 netlink
4.3.5 トレースポイント
4.3.6 kprobe
4.3.7 uprobe
4.3.8 USDT
4.3.9 ハードウェアカウンタ(PMC)
4.3.10 可観測性ツールのその他の情報ソース
4.4 sar
4.4.1 sar(1)でできること
4.4.2 sar(1)モニタリング
4.4.3 sar(1)のライブ出力
4.4.4 sar(1)のドキュメント
4.5 トレーシングツール
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.2.8 パフォーマンスマントラ
5.3 プログラミング言語
5.3.1 コンパイル言語
5.3.2 インタープリタ言語
5.3.3 仮想マシン
5.3.4 ガベージコレクション
5.4 メソドロジ
5.4.1 CPUプロファイリング
5.4.2 off-CPU分析
5.4.3 システムコール分析
5.4.4 USEメソッド
5.4.5 スレッド状態の分析
5.4.6 ロック分析
5.4.7 静的パフォーマンスチューニング
5.4.8 分散トレーシング
5.5 可観測性ツール
5.5.1 perf
5.5.2 profile
5.5.3 offcputime
5.5.4 strace
5.5.5 execsnoop
5.5.6 syscount
5.5.7 bpftrace
5.6 注意点
5.6.1 不明なシンボル
5.6.2 不明なスタック
5.7 練習問題
5.8 参考文献
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 命令サイズ
6.3.6 SMT
6.3.7 IPC、CPI
6.3.8 使用率
6.3.9 ユーザー時間/カーネル時間
6.3.10 飽和
6.3.11 プリエンプション
6.3.12 優先度の逆転
6.3.13 マルチプロセスとマルチスレッディング
6.3.14 ワードサイズ
6.3.15 コンパイラの最適化
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.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 pidstat
6.6.8 time、ptime
6.6.9 turbostat
6.6.10 showboost
6.6.11 pmcarch
6.6.12 tlbstat
6.6.13 perf
6.6.14 profile
6.6.15 cpudist
6.6.16 runqlat
6.6.17 runqlen
6.6.18 softirqs
6.6.19 hardirqs
6.6.20 bpftrace
6.6.21 その他のツール
6.7 ビジュアライゼーション
6.7.1 使用率ヒートマップ
6.7.2 秒未満オフセットヒートマップ
6.7.3 フレームグラフ
6.7.4 FlameScope
6.8 実験
6.8.1 アドホックテスト
6.8.2 SysBench
6.9 チューニング
6.9.1 コンパイラのオプション
6.9.2 優先度とクラスの操作
6.9.3 スケジューラオプション
6.9.4 スケーリングガバナー
6.9.5 電力状態
6.9.6 CPUへのバインド
6.9.7 排他的cpuset
6.9.8 リソースコントロール
6.9.9 セキュリティブートオプション
6.9.10 プロセッサオプション(BIOSチューニング)
6.10 練習問題
6.11 参考文献
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.2.10 ワーキングセットサイズ
7.2.11 ワードサイズ
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.4.10 メモリシュリンク
7.5 可観測性ツール
7.5.1 vmstat
7.5.2 PSI
7.5.3 swapon
7.5.4 sar
7.5.5 slabtop
7.5.6 numastat
7.5.7 ps
7.5.8 top
7.5.9 pmap
7.5.10 perf
7.5.11 drsnoop
7.5.12 wss
7.5.13 bpftrace
7.5.14 その他のツール
7.6 チューニング
7.6.1 パラメータ
7.6.2 複数のページサイズ
7.6.3 アロケータ
7.6.4 NUMAバインディング
7.6.5 リソースコントロール
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.6 可観測性ツール
8.6.1 mount
8.6.2 free
8.6.3 top
8.6.4 vmstat
8.6.5 sar
8.6.6 slabtop
8.6.7 strace
8.6.8 fatrace
8.6.9 LatencyTOP
8.6.10 opensnoop
8.6.11 filetop
8.6.12 cachestat
8.6.13 ext4dist(xfs、zfs、btrfs、nfs)
8.6.14 ext4slower(xfs、zfs、btrfs、nfs)
8.6.15 bpftrace
8.6.16 その他のツール
8.6.17 ビジュアライゼーション
8.7 実験
8.7.1 アドホックテスト
8.7.2 マイクロベンチマークツール
8.7.3 キャッシュのフラッシュ
8.8 チューニング
8.8.1 アプリケーションからの呼び出し
8.8.2 ext4
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 OSのディスク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.6 可観測性ツール
9.6.1 iostat
9.6.2 sar
9.6.3 PSI
9.6.4 pidstat
9.6.5 perf
9.6.6 biolatency
9.6.7 biosnoop
9.6.8 iotop,biotop
9.6.9 biostacks
9.6.10 blktrace
9.6.11 bpftrace
9.6.12 MegaCli
9.6.13 smartctl
9.6.14 SCSIロギング
9.6.15 その他のツール
9.7 ビジュアライゼーション
9.7.1 折れ線グラフ
9.7.2 レイテンシ散布図
9.7.3 レイテンシヒートマップ
9.7.4 オフセットヒートマップ
9.7.5 使用率ヒートマップ
9.8 実験
9.8.1 アドホックテスト
9.8.2 カスタムロードジェネレータ
9.8.3 マイクロベンチマークツール
9.8.4 ランダム読み出しの例
9.8.5 ioping
9.8.6 fio
9.8.7 blkreplay
9.9 チューニング
9.9.1 OSのパラメータ
9.9.2 ディスクデバイスのパラメータ
9.9.3 ディスクコントローラのパラメータ
9.10 練習問題
9.11 参考文献
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.3.11 ローカル接続
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.6 可観測性ツール
10.6.1 ss
10.6.2 ip
10.6.3 ifconfig
10.6.4 nstat
10.6.5 netstat
10.6.6 sar
10.6.7 nicstat
10.6.8 ethtool
10.6.9 tcplife
10.6.10 tcptop
10.6.11 tcpretrans
10.6.12 bpftrace
10.6.13 tcpdump
10.6.14 Wireshark
10.6.15 その他のツール
10.7 実験
10.7.1 ping
10.7.2 traceroute
10.7.3 pathchar
10.7.4 iperf
10.7.5 netperf
10.7.6 tc
10.7.7 その他のツール
10.8 チューニング
10.8.1 システム全体でのチューニング
10.8.2 ソケットオプション
10.8.3 構成オプション
10.9 練習問題
10.10 参考文献
11章 クラウドコンピューティング
11.1 基礎知識
11.1.1 インスタンスタイプ
11.1.2 スケーラブルなアーキテクチャ
11.1.3 キャパシティプランニング
11.1.4 ストレージ
11.1.5 マルチテナンシー
11.1.6 オーケストレーション(Kubernetes)
11.2 ハードウェア仮想化
11.2.1 実装
11.2.2 オーバーヘッド
11.2.3 リソースコントロール
11.2.4 可観測性
11.3 OS仮想化
11.3.1 実装
11.3.2 オーバーヘッド
11.3.3 リソースコントロール
11.3.4 可観測性
11.4 軽量仮想化
11.4.1 実装
11.4.2 オーバーヘッド
11.4.3 リソースコントロール
11.4.4 可観測性
11.5 その他のタイプ
11.6 比較
11.7 演習問題
11.8 参考文献
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.3.10 ベンチマーキングのチェックリスト
12.4 ベンチマークについて問うべきこと
12.5 練習問題
12.6 参考文献
13章 perf
13.1 サブコマンドの概要
13.2 1行プログラム
13.2.1 イベントのリストの表示
13.2.2 イベント数の計算
13.2.3 プロファイリング
13.2.4 静的トレーシング
13.2.5 動的トレーシング
13.2.6 レポート作成
13.3 perfイベント
13.4 ハードウェアイベント
13.4.1 周波数サンプリング
13.5 ソフトウェアイベント
13.6 トレースポイントイベント
13.7 プローブイベント
13.7.1 kprobe
13.7.2 uprobe
13.7.3 USDT
13.8 perf stat
13.8.1 オプション
13.8.2 インターバルごとの統計
13.8.3 CPU間のバランス
13.8.4 イベントフィルタ
13.8.5 シャドウ統計
13.9 perf record
13.9.1 オプション
13.9.2 CPUプロファイリング
13.9.3 スタックウォーク
13.10 perf report
13.10.1 TUI
13.10.2 STDIO
13.11 perf script
13.11.1 フレームグラフ
13.11.2 トレーススクリプト
13.12 perf trace
13.12.1 カーネルのバージョンによる違い
13.13 その他のコマンド
13.14 perfのドキュメント
13.15 参考文献
14章 Ftrace
14.1 機能の概要
14.2 tracefs(/sys)
14.2.1 tracefsの内容
14.3 Ftraceの関数プロファイラ
14.4 Ftraceの関数トレーサー
14.4.1 traceの使い方
14.4.2 trace_pipeの使い方
14.4.3 オプション
14.5 トレースポイント
14.5.1 フィルタ
14.5.2 トリガー
14.6 kprobe
14.6.1 イベントトレーシング
14.6.2 引数
14.6.3 戻り値
14.6.4 フィルタとトリガー
14.6.5 kprobeプロファイラ
14.7 uprobe
14.7.1 イベントトレーシング
14.7.2 引数と戻り値
14.7.3 フィルタとトリガー
14.7.4 uprobeプロファイラ
14.8 Ftraceの関数グラフトレーサー
14.8.1 コールグラフのトレーシング
14.8.2 オプション
14.9 Ftraceのハードウェアレイテンシ(hwlat)トレーサー
14.10 Ftrace histトリガー
14.10.1 単一キー
14.10.2 フィールド
14.10.3 修飾子
14.10.4 PIDフィルタ
14.10.5 複数キー
14.10.6 スタックトレースキー
14.10.7 合成イベント
14.11 trace-cmd
14.11.1 サブコマンドの概要
14.11.2 trace-cmdの1行プログラム
14.11.3 trace-cmdと perf(1)
14.11.4 trace-cmdによる関数グラフトレーシング
14.11.5 KernelShark
14.11.6 trace-cmdのドキュメント
14.12 perf ftrace
14.13 perf-tools
14.13.1 対象領域
14.13.2 単一目的ツール
14.13.3 多目的ツール
14.13.4 perf-toolsの1行プログラム
14.13.5 例
14.13.6 perf-toolsと BCC/BPF
14.13.7 ドキュメント
14.14 Ftraceのドキュメント
14.15 参考文献
15章 BPF
15.1 BCC
15.1.1 インストール
15.1.2 ツールの対象領域
15.1.3 単一目的ツール
15.1.4 多目的ツール
15.1.5 1行プログラム
15.1.6 多目的ツールの実行例
15.1.7 BCCとbpftrace
15.1.8 ドキュメント
15.2 bpftrace
15.2.1 インストール
15.2.2 ツール
15.2.3 
1行プログラム
15.2.4 プログラミング
15.2.5 リファレンス
15.2.6 ドキュメント
15.3 参考文献
16章 ケーススタディ
16.1 予想外の成果
16.1.1 問題の記述
16.1.2 分析の戦略
16.1.3 統計の数値
16.1.4 構成
16.1.5 PMC
16.1.6 ソフトウェアイベント
16.1.7 トレーシング
16.1.8 結論
16.2 その他の情報
16.3 参考文献
付録A USEメソッド: Linux
A.1 物理リソース
A.1.1 全般的な注
A.2 ソフトウェアリソース
A.3 参考文献
付録B sarのまとめ
付録C bpftrace1行プログラム
C.1 CPU
C.2 メモリ
C.3 ファイルシステム
C.4 ディスク
C.5 ネットワーキング
付録D 練習問題の解答
D.1 2章メソドロジ
D.2 3章オペレーティングシステム
D.3 6章 CPU
D.4 7章メモリ
D.5 8章ファイルシステム
D.6 9章ディスク
D.7 11章クラウドコンピューティング
付録E システムパフォーマンス関連の著名人リスト
E.1 参考文献
付録F 用語集
索引
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment