【技術本】詳解システム・パフォーマンス
https://amzn.to/40msRDR
【技術本】詳解システム・パフォーマンス
へポスト
Linux,Solarisを中心に、エンタープライズシステムから、クラウドシステムまでの性能要件の分析における論理思考アプローチの手法を学べる。
技術的な面は、物理コンポーネントからソフトウェアスタック全体(アプリケーションソフトウェア、ミドルウェア、システムライブラリ、カーネル全て含む)まで考慮した上で、各ボトルネックとなりうる、OS、アプリケーション、CPU、メモリ、ファイルシステム、ディスク、ネットワーク、クラウドシステムの章に分け、それぞれ、用語解説、基礎知識、重要概念(コンセプト)、調査手法(メソドロジ)、主にunixコマンドやDTraceを使用した分析、およびチューニング方法などを記載している。
そのため、各ボトルネックごとに用語、前提知識から入り、アーキテクチャなど重要概念を習得した後に、ボトルネックを更に絞り込む調査手法と、必要な状況に合わせた分析コマンドの候補、コマンドで注目すべきパラメータ候補などの技術的な内容へと段階的に学習を進めることができる。
各章独立しており、上記の章構成を理解すれば、必要に応じて詳細を参照できる手引書として使い勝手がかなり良くなる。
翻訳が少なからず難解だが、本書を勉強することで、システムの全体を俯瞰でき、どの分野の調査にドリルダウンが及んでも、基本的な前提知識はほとんどクリアされる(「Unknown-Unknowns:無知であることすら知らない」を払拭できる)といっても過言では無いくらい高度な内容が記されていると感じた。
調査方法についても、いくつかのフレームワークとも言える調査手法(メソドロジ)を用意しており、端的にチェック項目をクリアしていくだけでも、規定水準の調査が行え、より洗練された調査方法習得への足がかりも用意してくれている。
ハードウェア、ソフトウェアの両側面において、現状のシステムの性能調査のための前提知識の習得に役立つし、新規で設計するシステム構築における性能品質確保のための前提知識としても役に立つ著作だと感じた。
以下、記載事項のまとめ(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.ケーススタディ
パフォーマンスアナリストの問題解決までの論理思考を踏まえた事例の紹介。
----------------------
以上。
へポスト