地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】詳解 システムパフォーマンスの読書メモ

1.イントロダクション

視点
・ワークロード分析:トップダウン
 ソフトウェアスタックのアプリ側から分析
リソース分析:ボトムアップ
 ソフトウェアスタックのデバイス、カーネル側から分析

動的トレーシング
 本番環境のソフトウェアからあらゆる箇所の経過時間をライブで計測
 DTrace:本番環境で使えるツール:Solarisでオープンソース化>その後、Mac OSX, FreeBSD, Linuxへ

----------------------
2.メソドロジ
 パフォーマンス問題を起こしている場所を特定し、問題を分析するためにどこから始め、どのような手順を踏んだらよいかを示してくれるもの。

メソドロジ
・問題の記述
 異常と判断した時間、最近の変更、環境、ハードウェア、ソフトウェアなどの状況をヒアリングしていく。これで原因や解決方法がわかる時がある 
・科学的メソッド
 問題、仮説、予測、検証、分析を実行する
・診断サイクル
 仮説>>インストルメンテーション>>データ>>仮説を繰り返す
・ツールメソッド
 利用できるパフォーマンスツールをリストアップ
 個々のツールについて得られる役に立つ指標をリストアップ
 個々の指標について、解釈のためのルールをリストアップ
・USEメソッド
 パフォーマンス調査の初期に使うべきメソッド
 全てのリソースについて、使用率、飽和、エラー(エラーイベント数)をチェックする。
 リソースのリストアップを行い、使用率、飽和、エラーで問題が検出されたら、それを精査して原因を探る。なければ、次の問題に移り、なくなるまで繰り返す。
・ワークロードの特性の把握
 システムに対する入力に注目する
 誰が負荷をかけているのか:ProcessID, USerID, IPAddress
 なぜ負荷がかかっているのか:コードパス、スタックトレース
 負荷の特徴は何か:IOPS,スループット、読み書き
 負荷は時系列でどの様に変化しているか
・ドリルダウン分析
 広い分野で問題を検証開始し、わかったことに基づいて焦点を絞っていき、関係のなさそうな領域を捨て、関係ありそうな領域を深く掘り下げていく。
 モニタリング>>特定>>分析
 分析の段階で、「5つのなぜ」の補助メソドロジを利用して掘り下げを繰り返す
・レイテンシ分析
 オペレーションが完了するまでの時間を解析し、細かくコンポーネント分割し、最もレイテンシの高いコンポーネントをさらに分解していき、根本原因をつきとめ、定量化するもの。
・イベントトレーシング
 CPU命令、ディスクI/O、ディスクコマンド、ネットワークパケット、システムコール、ライブラリ呼び出し、アプリトランザクション、データベースクエリーなどの、秒あたりのオペーレション数、バイト数、平均レイテンシなど、これらのイベントの集計情報を検討する。
 入力:イベント要求の全ての属性(タイプ、方向、サイズなど)
 時間:開始時間、終了時間、レイテンシ
 結果:エラーステータス、イベントの結果(サイズ)
・ベースライン統計
現在のパフォーマンス指標と過去の値を比較
 負荷や、リソースの使用状況の違いが特定でき、問題が始まった時まで辿れる
・静的パフォーマンスチューニグ
システムが休みに貼って負荷が全くかかっていないときに実行できる
 以下をチェックする
 各コンポーネントに意味があるか
 構成は、想定されるワークロードにとって意味のあるものになっているか
 コンポーネントは想定されるワークロードに最も合う状態に自動的に構成されているか
 コンポーネントがエラーを起こし、最適でない状態で動作しているか
・キャッシュチューニング
 アプリケーションからディスクまでに利用されている複数のキャッシュをチューニングする
・マイクロベンチマーキング
 ワークロードを与えてパフォーマンスを計測するマイクロベントマークツールで実行する

----------------------
3.オペレーティングシステム
 オペレーティングシステムと、カーネルの挙動について記載。

----------------------
4.可観測性ツール
 各状況下での観測方法と、観測で使用するコマンドの詳細を記載。

ツールのタイプ
・カウンタ
 イベントの回数を数えたもの
 システム全体を対象
 >vmstat
 >mpstat
 >iostat
 プロセスごとのカウンタ
 >ps
 >top
 >pmap
・トレーシング
 イベントごとのデータを集めてくる
 CPUオーバヘッドが大きいのでデフォルトでは有効にされていない
 システム全体
 >tcpdump
 >snoop
 >blktrace
 >iosnoop
 >dtruss
 >DTrace
 >SystemTap
 >perf
 プロセスごと
 >strace
 >truss
 >gdb
 >mdb
・プロファイリング
 ターゲットの挙動のサンプル、スナップショットを集める
 >oprofile
 >perf
 >Dtrace
 >SystemTap
 >cachegrind
・モニタリング
 >sar
・可観測性ツールの情報ソース(linux)
 プロセスごとのカウンタ:/proc
 システム全体のカウンタ:/proc, /sys
 デバイスドライバごとのデバッグ情報:/sys
 プロセスごとのトレーシング:ptrace, uprobe
 CPUパフォーマンスカウンタ:perf_event
 ネットワークトレーシング:libcap
 スレッドごとのレイテンシ指標:遅延アカウンティング
 システム全体のトレーシング:tracepoint, kprobe, ftrace

----------------------
5.アプリケーション
 DB,Webサーバ、アプリケーションサーバ、ロードバランサ、ファイルサーバなどが含まれる
 通常はアプリケーションでベロッッパの領域

メソドロジと分析
・スレッドの状態の分析
 広い視野でアプリのスレッドが時間を費やしている箇所を明らかにすることを目標
 スレッド状態
 >CPU上:実行中
 >実行可能:CPU時間を得る順序待ち
 >無名ページング:実行可能だが、ページインを待ってブロック中
 >スリープ:ネットワーク、ブロックデバイス、データ/コードのページインなど、I/Oを待っている
 >ロック:同期ロックの獲得を待っている
 >アイドル:ワークロードを待っている
 実行に費やされている時間:top
 実行可能状態で費やされてる時間:/proc/*/schedulestat
 無名ページング:遅延アカウンティング機能で計測
 スリープ:pidstat -d、iotop, pstack
 ロック:トレーシングツール
・CPUのプロファイリング
 Dtraceの利用
・システムコールの分析
 実行中状態:Dtrace
 strace
・I/Oのプロファイリング
 DTrace
・USEメソッド
・ドリルダウン分析
 動的トレーシングツール:DTrace, SystemTap, perf
 ライブラリ呼び出し解析:ltrace
・ロック分析
 競合のチェック
 長すぎるロック保持のチェック
 plockstat
 lockstat
・静的パフォーマンスチューニング

----------------------
6.CPU
 CPUの使用状況は、高いレベルではプロセス、スレッド、タスクにより確認できる。
 低いレベルでは、アプリケーションやカーネルのコードパスをプロファイリング、解析できる。
 もっと低いレベルでは、CPUの実行命令やサイクルを解析できる。

メソドロジ
 オススメの手順:パフォーマンスモニタリング>USEメソッド>プロファイリング>マイクロベンチマーク>静的分析
・ツールメソッド
 uptime
 vmstat
 mpstat
 top/prstat
 pidstat/prstat
 perf/dtrace/stap/oprofile
 perf/cpustat
・USEメソッド
・ワークロードの特性の把握
 CPUワークロードを特徴付ける基本属性
 ロードアベレージ、ユーザ時間とシステム時間の比率、システムコールの頻度、自発的なコンテキストスイッチの頻度、割り込みの頻度
 ユーザ時間過多>アプリの独自計算
 I/Oバウンドのワークロードは、システム時間の比率とシステムコールお頻度が高い、I/Oを待ってスレッドがブロックする
 ・チェックリスト
 >システム全体でCPU使用率はどうなっているか、CPUごとは
 >CPUの負荷はどれくらい並列化されているか、スレッドはいくつか
 >どのアプリケーションまたはユーザがどのくらいCPUを使っているか
 >どのカーネルスレッドがCPUをどのくらい使ってるか
 >割り込みのCPU使用状況はどれくらいか
 >CPUインターコネクトの使用率はどれくらいか
 >CPUはなぜ使われているのか(ユーザ、カーネルレベルのコールパス)
 >どのようなタイプのストールサイクルが発生してるか
・プロファイリング
 解析対象のイメージを構築する。
 一定のインターバルでCPUの状態をサンプリングする。 
 DTrace
・サイクル分析
 CPU Performance Counterを使えば、CPUの使用率がサイクルレベルでわかる。
 この分析で、サイクルがレベル1,2,3キャッシュミス、メモリI/O、リソースI/Oでストールしているか、浮動小数点演算その他のアクティビティで使われているのかがわかる。
・パフォーマンスモニタリング
 CPUの主な指標
 >使用率
 >飽和
・静的パフォーマンスチューニング
 構成された環境の問題点を明らかにする
 >何個のCPUが使える状態になっているか コア/ハードウェアスレッド
 >CPUのアーキテクチャはシングルプロセッサかマルチプロセッサか
 >CPUのクロックスピードはどれだけか
 >BIOSで有効、または無効になっているCPU関連んおその他の機能は何か
 >このプロセッサモデルには、パフォーマンス問題があるか
 >このBIOSファームウェアバージョンにはパフォーマンス問題があるか
 >ソフトウェアで強制されたCPUの使用制限はあるか、それはなにか
・優先度のチューニング
 プロセスの優先度を調整するためにナイス値を設定する。 
・CPUのバインド
 個別のCPU,またはCPUのコレクションにプロセスやスレッドをバインドする方法がある
 キャッシュのウォームド上昇
 メモリI/Oパフォーマンス向上
・マイクロベンチマーク
 マイクロベンチマークツール活用
・スケーリング
 リソースのキャパシティプランニングに基づくスケーラビリティの計算で見積もる

分析
 uptime:ロードアレベレージ
 vmstat:システム全体でのCPUアベレージ
 mpstat:CPUごとの統計
 sar:履歴的な統計
 ps:プロセスのステータス
 top:プロセス、スレッドごとのCPU使用状況
 pidstat:プロセス、スレッドごとのCPU利用の分析
 time:コマンドの時間の分析、CPU利用の分析も含む
 DTrace:CPUのプロファリングとトレーシング
 perf:CPUパフォーマンスカウンタ分析

----------------------
7.メモリ
 アプリケーションやカーネルの命令、そのワーキングデータ、ファイルシステムキャッシュを格納する。
 メモリがいっぱいになると、システムはメインメモリと、さらに遅いストレージデバイスとの間でデータ交換を始める。>システムのボトルネックになりうる遅い処理
 メモリのアロケート、解放、メモリコピー、アドレス空間のマッピングの管理にもCPUコストがかかる。

メソドロジ
・ツールメソッド
 ページスキャン:sar -Bでpgscan欄チェック
 ページング:vmstatでsi,so欄チェック
 vmstat
 OOMキラー:/var/log/messages、dmsg
 スワッピング:vmstat -Sでsi,so欄チェック
 top/prstat
 dtrace/stap/perf
・USEメソッド
 使用率、飽和、エラーンのチェック
 vmstat, sar, dmesg
・使用形態の特性の把握
 メモリをどこでどのように使ってるかはっきりさせる
 システム全体での物理/仮想メモリの使用率
 飽和の度合い:ページング、スワッピング、OOMキラー
 カーネルとファイルシステムのキャッシュメモリの使い方
 プロセスごとの物理/仮想メモリの使用状況
 メモリリソースコントロールが使われている場合は、その使い方
・サイクル分析
 メモリバスの負荷はCPCをみれば調べられる
・パフォーマンスチューニング
 指標:使用率、飽和
・リーク検出
 メモリリーク、メモリの成長が速いものをチェック
・静的パフォーマンスチューニング
 構成された環境の問題点を明らかにする

分析
 vmstat:仮想、物理メモリの統計
 sar:履歴的な統計
 slabtop:カーネルのスラブアロケータの統計
 ps:プロセスのステータス
 top:プロセスごとのメモリ使用状況のモニタリング
 pmap:アドレス空間の統計
 DTrae:アロケーションのトレーシング

----------------------
8.ファイルシステム
 I/Oパフォーマンスを解析するときは、ファイルシステムのパフォーマンスの方が、ディスクパフォーマンスより問題になる。

メソドロジ
・レイテンシの分析
 ファイルシステムオペレーションのレイテンシを計測する
 レイヤ
 アプリケーション
 システムコールインタフェース
 VFS
 ファイルシステムのトップ
・ワークロードの特性の把握
 ・基本属性
 >オペレーションの速さとタイプ
 >ファイルI/Oのスループット
 >
 >ファイルI/Oのサイズ
 >読み書きの比率
 >同期書き込みの比率
 >ファイルオフセットへのランダムなアクセスとシーケンシャルなアクセス
 ・チェックリスト
 >ファイルシステムキャッシュのヒット率とミス率はどうか
 >ファイルシステムキャッシュの容量と現在の使用状況はどうなっているか
 >ほかにどのようなキャッッシュがあるか、統計はどうか
 >どのアプリケーション、どのユーザがファイルシステムを使っているか
 >どのファイル、ディレクトリがアクセスされているか。作成、削除されているファイルはどれか
 >エラーは起きているか。向こう要求によるものか、ファイルシステムから発行されたものか
 >ファイルシステムI/Oのうちどれくらいが同期的か
 >I/Oの到着時間の分布はどうなっているか
 ・パフォーマンス特製の把握
 >ファイルシステムオペレーションの平均的なレイテンシはどれくらいか
 >レイテンシの高い外れ値はあるか
 >オペレーションのレイテンシの完全な分布はどうなっているか
 >ファイルシステムやディスクI/Oに対するシステムリソースはあるか。アクティブになっているか。  
・パフォーマンスモニタリング
 指標
 オペレーションの頻度
 オペレーションおレイテンシ
・イベントトレーシング
 観察的な分析では最後の手段
 詳細情報のキャプチャ、保存のためにパフォーマンスにオーバヘッドを加える。
 詳細はログに書き込まれる。
・ワークロードの分離

分析
 strace:システムコールデバッガ
 DTrace:ファイルシステムオペレーション、レイテンシの動的トレーシング
 free:キャッシュ容量統計
 top:ファイルシステムキャッシュの詳細情報が含まれている
 vmstat:仮想メモリの統計情報
 sar:履歴データを含む様々な統計情報
 slabtop:カーネルスラブアロケータの統計
 /proc/meminfo:カーネルメモリの分析情報

----------------------
9.ディスク
ディスクI/Oはアプリケーションのレイテンシを大幅に高くするので重要な分析対象。

メソドロジ
・ツールメソッド
 iostat
 iotop
 dtrace/stap/perf
・USEメソッド
 初期の段階で全てのコンポーネントを対象にボトルネックやエラーを見つける
 指標:使用率、飽和、エラー
・パフォーマンスモニタリング
 現にある問題や経時的な振る舞いのパターンを明らかにする
 指標:ディスク使用率、応答時間
・ワークロードの特性の把握
 基本属性:I/Oの頻度、I/Oスループット、I/Oサイズ、ランダムかシーケンシャルか、読み書きの比率
・レイテンシ分析
 システムを掘り下げてレイテンシの原因を見つける
・イベントトレーシング
 全てのI/Oイベントの情報をキャプチャして別々に記録して分析。
 静的分析として最後の手段
・静的パフォーマンスチューニング
 構成された環境の問題を明らかにする
・キャッシュチューニング
・リソースコントロール
・マイクロベンチマーキング

分析
 iostat:ディスクごとの様々な統計
 sar:履歴データを使ったディスクの統計
 pidstat,iotop:プロセスごとのディスクI/Oの使用状況
 blktrace:ディスクI/Oイベントトレーシング
 DTrace:カスタムの静的・動的トレーシング
 MegaCli:ISIコントローラの統計
 smartctli:ディスクコントローラの統計

----------------------
10.ネットワーク

メソドロジ
・ツールメソッド
 netstat -s
 netstat -i
 ifconfig
 tcpdump/snoop
 dtrace/stap/perf
・USEメソッド
・ワークロードの特性の把握
 ネットワークインタフェースのスループット
 ネットワークインタフェースのIOPS
 TCP接続の頻度
・レイテンシの分析
 システムコールの送受信遅延
 システムコールの接続遅延
 TCP接続初期化時間
 TCP TTFB
 TCP接続時間
 TCP再送
 RTT
 割り込みレイテンシ
 インースタックレイテンシ
・パフォーマンスモニタリング
 スループット
 接続:1秒あたりに解説されているTCP接続の数
 エラー:落ちたパケットのカウンタ
 TCP再送
 TCPの順序が異なるパケット
・パケットスイッフィング
 パケットキャプチャ:tcpdump
・TCP分析
 TCP送信、受信バッファの使用状況
 TCPバックログキューの使用状況
 バックログキューがいっぱいになったことによるドロップ
 輻輳ウィンドウのサイズ
 TCPのTIME WAITインターバル間に受信したSYN
・ドリルダウン分析
 ネットワークのチューニング可能パラメータの調整が必要かどうかのチェック
 たとえばCPUファンアウト、Interrupt Coalescingなど、カーネルのネットワークパフォーマンス機能が効果を発揮しているかどうかの確認
 カーネルによるパケットのドロップの理由の説明
・静的パフォーマンスチューニング
リソースコントロール
 ネットワーク帯域幅の制限
 IPのサービス品質
・マイクロベンチマーキング
 テスト要素:
 方向:送信、受信
 プロトコル
 スレッド数
 バッファサイズ
 インタフェースMTUサイズ

分析
 netstati:様々なネットワークスタック、インタフェースの統計
 sar:履歴データを使った統計
 ifconfig:インタフェースの構成
 ip:ネットワークインタフェースの統計
 nicstat:ネットワークインタフェースのスループットと使用率
 ping:ネットワーク接続のテスト
 traceroute:ネットワークのルーティングのテスト
 pathchar:ネットワークパスの特性の判定
 tcpdump:ネットワークパケットスニッファ
 WireShark:ネットw−悪パケットのグラフィカルな解析
 DTrace,perf:TCP/IPスタックのトレーシング

----------------------
11.クラウドコンピューティング
 テナントが一つの物理サーバを共有できるようになっているため、リソースの競合が発生しうる。

基礎知識
 サービスは時間単位で販売、価格はインスタンスのメモリサイズで決まる。
 エンタープライズ環境は伝統的に垂直スケーラビリティ>1台のコンピュータの限界>水平スケーラビリティへ
 データベース:シャーディング
 キャパシティプランニング:動的サイジング
 ストレージ:クラウドのローカルストレージは揮発性。永続ストレージはファイルストア、ブロックストア、オブジェクトストアなどで提供される

OS仮想化
 グローバルゾーン、ゲストゾーン
 オーバヘッド
 >CPU:スレッドがユーザモードで実行しているときにはCPU実行のオーバヘッドなし
 >I/O:追加既往が構成されていなければオーバヘッドなし
 リソースコントロール
 >CPUキャップ:ゲストのCPU使用を制限。一定パフォーマンスをを期待できる。

ハードウェア仮想化
 完全仮想化:バイナリ変換、ハードウェア支援
 準仮想化
 ハイブリッド仮想化

----------------------
12.ベンチマーキング

メソドロジ
 パッシブベンチマーキング
 アクティブベンチマーキング
 CPUプロファイリング
 USEメソッド
 ワークロードの特性の把握
 カスタムベンチマーク
 ランプロード
 サニティチェック
 統計的分析

----------------------
13.ケーススタディ
 パフォーマンスアナリストの問題解決までの論理思考を踏まえた事例の紹介。

----------------------