# SRE Book - Chapter 12: Effective Troubleshooting
## 要約
本章は、分散コンピューティングシステムの運用において不可欠なトラブルシューティング能力を体系的に解説する。トラブルシューティングは生得的な才能ではなく、学習可能な技能であり、汎用的な方法論とシステム固有の知識という二つの基盤が必要である。仮説演繹法(hypothetico-deductive method)に基づく理論的枠組みを示したうえで、問題報告の受領からトリアージ、調査、診断、検証、修復に至る実践的な各段階を詳述する。特に、大規模障害時には根本原因分析よりもシステムの安定化を優先すべきという原則を強調する。App Engine のケーススタディでは、Dapper によるトレーシングと体系的な仮説検証を通じて、セキュリティスキャナが引き起こしたアクセス制御バグを特定した事例を紹介する。否定的結果の公開がもたらす組織的価値についても論じ、オブザーバビリティの組み込みとシステム設計の改善がトラブルシューティングを容易にすると結論づける。
## 主要概念
- **仮説演繹法(hypothetico-deductive method)**: トラブルシューティングの理論的基盤。システムの観測結果と理論的理解から仮説を立て、検証を繰り返して根本原因を特定する科学的手法である。
- **トリアージ**: 問題報告を受けた後、影響の深刻度に応じて適切な対応レベルを判断する段階。大規模障害では根本原因分析より先にシステムの安定化を優先する。
- **分割統治法(divide and conquer)**: 多層システムの診断手法。システムを半分に分割し、各部分間の通信を検査して障害箇所を絞り込む二分探索的アプローチである。
- **相関と因果の区別**: 相関する事象が必ずしも因果関係にあるとは限らない。システムが複雑化しモニタリングメトリクスが増えるほど、偶然の相関が不可避となる。
- **否定的結果(negative results)**: 期待した効果が現れなかった実験結果。否定的結果の公開は設計上の疑問を解決し、重複実験を防ぎ、データ駆動文化を改善する。
- **問題報告の標準化**: 期待される振る舞い、実際の振る舞い、再現手順を含む一貫したフォーマットで報告を記録し、検索可能な場所に保管する。
- **ロギングのベストプラクティス**: テキストログはリアルタイムデバッグに、構造化バイナリログは遡及的分析に適する。動的な冗長度調整とセレクションクエリが診断能力を高める。
- **現在状態の公開**: サーバが RPC サンプルやエラーレート、レイテンシヒストグラムを公開するエンドポイントを持つことで、アーキテクチャ図なしにシステムの通信状態を把握できる。
## 実践的指針
- 問題報告はすべてバグトラッキングシステムに記録し、メールやチャットで受けた場合もバグを起票する。これにより調査ログが将来のインシデントで参照可能になる。
- 大規模障害時は「状況下で可能な限りシステムを動かす」ことを最優先し、トラフィックの迂回、トラフィックの全面遮断、サブシステムの無効化などの緊急措置を講じる。診断用の証拠(ログ等)は保全する。
- 診断では「何が起きているか」「どこでリソースが消費されているか」「なぜそうなるか」の三つの問いを繰り返し、障害メカニズムを理解する。
- 最後に変更された箇所を調べる。動作中のシステムには慣性があり、設定変更・負荷パターンの変化・デプロイといった外部要因が障害の起点となることが多い。
- 仮説の検証は可能性の高い順に実施し、各テストの相互排他性、交絡因子、副作用を考慮する。
- テスト結果と考察は明確に記録し、長期化する調査での手順の重複を防ぎ、ポストモーテムを支援する。
- 否定的結果を含めて公開する。実験の工具やベンチマークは実験自体より長く活用される。
- オブザーバビリティ(ホワイトボックスメトリクスと構造化ログ)をシステム設計の初期段階から組み込み、リクエスト識別子をコンポーネント横断で一貫させる。
## 関連
- [[@2016__OReilly__SRE Book - Chapter 1 Introduction]]
- [[SRE Book]]
- [[SRE]]
## 出典
Beyer, B., Jones, C., Petoff, J. & Murphy, N. R. "Site Reliability Engineering: How Google Runs Production Systems," O'Reilly Media, 2016, Chapter 12.