1章:Introduction
システムパフォーマンスの一般的なユースケース
- アプリケーション層からコンパイラやOSカーネルまで、ボトルネックの要因は数多くある
パフォーマンス改善のためのRole
- SREやマイクロサービスの監視、誰でも監視できるための監視ツールの構築など
- 大規模な組織では、カーネルパフォーマンス、クライアントパフォーマンス、言語パフォーマンス(Javaなど)、ランタイムパフォーマンス(JVMなど)、パフォーマンスツーリングなどのスペシャリストが存在する場合もある(Nextflix)
パフォーマンス改善のための行動
- 将来の製品に向けた性能目標の設定と性能のモデル化。
- プロトタイプのソフトウェアとハードウェアの性能特性評価。
- テスト環境における開発中の製品の性能分析
- 新製品のバージョンアップに伴う無劣化テスト
- 製品リリースのベンチマーク
- ターゲット本番環境での概念実証テスト。
- 本番環境でのパフォーマンスチューニング
- 運用中のソフトウェアのモニタリング
- 運用中の問題のパフォーマンス分析
- 生産上の問題に対するインシデントレビュー
- 生産性解析を強化するパフォーマンスツールの開発
1~5までは従来の開発手法
最近のクラウドコンピューティングでは6以降のステップをサービスとして提供していることが多い
観点
- 性能解析には異なる2つの視点であるワークロード解析とリソース解析がある
パフォーマンスの主観性・複雑性について
パフォーマンスの解釈は主観的に判断されることが多い。
例えばディスクI/Oの平均応答時間は1msの場合、これは「良い」でしょうか?それとも「悪い」でしょうか?
応答時間(レイテンシー)は最も優れた測定基準の1つですが、レイテンシーの情報を解釈することは困難です。あるメトリクスが「良い」か「悪い」かは、ある程度、アプリケーション開発者とエンドユーザーの期待する性能に依存する場合があります。
主観的なパフォーマンスは、目標とする平均応答時間を設定したり、リクエストの何パーセントが特定のレイテンシ範囲内に収まるように要求するなど、明確な目標を定義することによって客観化することができます。この主観に対処する他の方法として、レイテンシ解析などが第2章「方法論」で紹介されています。
複雑性に置いても、昨今のシステムは異なるコンポーネント同士が相互作用しており原因解明のあたりを正確につけるのが難しい。また局所的な改善になることも多く全体のパフォーマンスを大きく向上させることは難しい。
定量的に算出しやすいレイテンシーという指標
レイテンシーとは?
レイテンシーとは、待ち時間のことで、重要な性能指標の一つである。広義には、アプリケーションのリクエスト、データベースのクエリー、ファイルシステムのオペレーションなど、あらゆるオペレーションが完了するまでの時間を意味します。例えば、Webサイトが完全にロードされるまでの時間(リンクがクリックされてから画面が表示されるまでの時間)を表すことができます。これは、お客様とウェブサイトプロバイダー双方にとって重要な指標です。待ち時間が長いとフラストレーションが溜まり、ユーザーは他の場所に行ってしまう可能性があります。
例:ディスクI/O
レイテンシーを指標とすることで、最大限の高速化を見積もることができます。例えば、図1.3は、データベースクエリに100ms(レイテンシ)かかり、その間に80msのディスクリードのブロック待ち時間がある場合を示しています。ディスク読み出しがない場合(キャッシングなど)の最大性能向上は、100 ms から 20 ms まで(100 - 80)5倍速くなる。これは推定される高速化であり、この計算により、ディスク読み出しが原因でクエリが最大5倍遅くなるという性能上の問題も定量化できる。
他の指標を使用する場合、このような計算は不可能である。たとえば、IOPS(I/O operations per second)は、I/Oの種類に依存し、直接比較できないことが多い。ある変更によってIOPS率が80%低下した場合、パフォーマンスにどのような影響が出るかを知ることは困難です。IOPSは5倍減るかもしれませんが、これらのI/Oのサイズ(バイト)がそれぞれ10倍になったらどうなるか?
可観測性
観測性とは、観測によってシステムを理解することであり、それを実現するためのツールを分類したものである。カウンタ、プロファイリング、トレースなどを利用するツールが含まれる。
例えば、vmstatなどLinuxに標準で搭載されている計測コマンドを使用して、モニタリング基盤を構築することが推奨される
モニタリング項目の解釈方法は、第2章方法論の8節統計情報で詳細を述べる。
プロファイリングについて
システムパフォーマンスにおいて、プロファイリングとは通常、サンプリングを行うツールの使用を指します。これは、測定値のサブセット(サンプル)を採取し、対象物の大まかなイメージを描くことです。CPUは一般的なプロファイリング対象です。CPUのプロファイリングによく使われる方法は、CPU上のコードパスの時間間隔サンプルを採取することです。
トレース
トレースはイベントベースの記録であり、イベントデータをキャプチャして保存し、後で分析したり、その場で消費してカスタムサマリーやその他のアクションに利用することができます。
システムコール(Linux strace(1))やネットワークパケット(Linux tcpdump(8))などの特殊用途のトレースツールや、あらゆるソフトウェアやハードウェアイベントの実行を分析できる汎用トレースツール(Linux Ftrace、BCC、bpftraceなど)がある。これらの全方位型トレーサは、様々なイベントソース、特に静的および動的インスツルメンテーション、そしてプログラマビリティのためのBPFを使用する。
負荷試験
- ベンチマークを指すことが多い。
- 観測と実験の両方がパフォーマンス解析には必要
方法論
- システムパフォーマンスを行うために必要なタスクを文書化したもの
以下は著者が、パフォーマンスの問題に対して最初に使用するツールベースのチェックリスト