論文『Fault Injection Technique and Tools』のFault Injection Techniqueのまとめ

# おことわり

* 論文発行年度が古いことから、Fault Injection Techniqueのみ、まとめています
* Fault Injection という分野の概念をざっくり理解したいというモチベーションです
* ソフトウェア屋なので、ソフトウェア観点が多めです

---
# 論文情報
Hsueh, Mei-Chen, Timothy K. Tsai, and Ravishankar K. Iyer. "Fault injection techniques and tools." Computer 30.4 (1997): 75-82.

https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19970022435.pdf

 
---
# Fault Injection とは
1. ある機能における設計段階の潜在的な故障やエラー
2. システムの試験運用、本運用時の故障やエラー
の理解をするための仕組み

<table>
<tbody>
  <td>動作環境</td>
  <td>用途</td>
</tbody>
<tr>
  <th> simulation </th>
  <td> 耐故障性（fault tolerant）やシステム信頼性(System Dependability)の評価 </td>
</tr>
<tr>
  <th rowspan=4> prototype </th>
  <td>1. ボトルネックの評価 </td>
</tr>
<tr>
  <td> 2. 耐故障性、システム信頼性の保証評価 </td>
</tr>
<tr>
  <td> 3. システム稼働中に発生するFAIL原因の調査 </td>
</tr>
<tr>
  <td> 4. エラーと回復検知カバレッジの把握 </td>
</tr>
</table>

---
# workloadによるシステム評価とFault Injectionによる評価の違い

* workloadによる評価
    * 実用性の観点からシステムを評価する
    * エンジニアが評価することが多い
* Fault Injection による評価
    * システムのエラーモデル保証を評価する
    * テスト評価が評価することが多い

---
# Fault Injection システムの機能要件
* fault detection
* fault isolation
* fault reconfiguration
* recovery capabilities

---
# Fault Injection アーキテクチャ
 ![fault injection model (1).png](https://qiita-image-store.s3.amazonaws.com/0/142884/539012c5-2837-6438-2a5e-7012e67986b4.png)

<table>
<tbody>
  <td>モジュール</td>
  <td>機能</td>
  <td>実現例</td>
</tbody>
<tr>
  <th>fault injector</th>
  <td>システムへエラーコマンド注入。エラータイミング、種別、エラー実行時間を管理する。</td>
  <td> SW / HW </td>
</tr>
<tr>
  <th>workload generator</th>
  <td> テストシナリオの生成と実行 </td>
  <td> アプリケーションベンチマーク、統合テスト </td>
</tr>
<tr>
  <th>monitor</th>
  <td>タスクや実行コマンドの監視およびデータの初期化</td>
  <td> - </td>
</tr>
<tr>
  <th> data collector </th>
  <td>リアルタイムでのデータ収集</td>
  <td> - </td>
</tr>
</table>
<table>
<tr>
  <td> サブモジュール</td>
  <td>機能</td>
</tr>
<tr>
  <th>Fault Lib</th>
  <td>Fail Injectorに提供する機能の柔軟性かつポータビリティをもったライブラリ群</td>
</tr>
<tr>
  <th>data analyzer</th>
  <td>リアルタイム・オフタイム両方のデータ解析機能を持ったツール</td>
</tr>
</table>

---
# Fault Injector の実現方法

ソフトウェア、ハードウェアの2種類ある。
Injectorの使い分けは発生させるエラー種別、エラー実現方法に依存する。（例）メモリのビット化け 
 
<table>
<tbody>
  <td>実現方法</td>
  <td>pros</td>
  <td>cons</td>  
</tbody>
<tr>
  <th>ハードウェア</th>
  <td>エラー注入タイミングが制御可能</td>
  <td>設計・実装・検証コストが高い</td>  
</tr>
<tr>
  <th rowspan=3>ソフトウェア</th>
  <td rowspan=3>エラーとして提供する機能の柔軟性</td>
  <td>ソフトウェアが介入できないケースはエラー注入不可</td>  
</tr>
<tr>
  <td> 実行時間など、時間精度管理が高くない </td>  
</tr>
<tr>
  <td> ワークロードに対する影響大。性能の揺れ原因になる </td>  
</tr>
</table>

---
# ハードウェアによるFault Injector実現方法 [1/2]
<table>
<tbody>
  <td>実現方法</td>
  <td>実現方法の概要</td>
  <td>手段</td>
</tbody>
<tr>
  <th>fault injection with contact</th>
  <td>システム内回路にピンを用意し、専用接続する</td>
  <td> pin-level socket and probes </td>
</tr>
<tr>
  <th>fault injection without contact</th>
  <td>外部から物理的にエラー現象を発生させる</td>
  <td> iron radiation, electronic magnetic interface </td>
</tr>
</table>

---
# ハードウェアによるFault Injector実現方法 [2/2]
<table>
<tbody>
  <td>手段</td>
  <td>手段の説明</td>
  <td>pros</td>
  <td>cons</td>
</tbody>
<tr>
  <td>active probes</td>
  <td>回路内部に物理的ピン接続して、ある処理タイミングでエラーを発生させる</td>
  <td>設計、実装コスト小</td>
  <td>評価対象のシステム回路の電流値が理論値とは異なる</td>
</tr>
<tr>
  <td> socket insertion </td>
  <td> 外部から特殊パラメータできた時にエラーが発生するような回路を作る</td>
  <td>システムに与える影響小</td>
  <td>実装コスト、周辺回路へのコスト大</td>
</tr>
<tr>
  <td> external interface </td>
  <td> 外部から物理的にシステムにダメージを与える </td>
  <td>自然発生現象に近いエラー発生モデル</td>
  <td>エラー発生タイミングやエラー時間の検証が難しい</td>
</tr>
</table>

---
# ソフトウェアによるFault Injector実現方法
<table>
<tbody>
  <td>手段</td>
  <td>説明</td>
  <td>pros</td>
  <td>cons</td>
</tbody>
<tr>
  <th>compile-time injection</th>
  <td>システムコンパイル時にエラー注入プログラムを埋め込む方式</td>
  <td>設計・実装がシンプル</td>
  <td>ワークロードプログラムに対するエラー注入タイミングが決め打ちになる</td>
</tr>
<tr>
  <th>run-time injection (timeout)</th>
  <td>予めタイマーをセットし、制限時間になったらシステムを全停止させる</td>
  <td>設計・実装がシンプル</td>
  <td>発生できるエラー回数は1回。その後は応答不可</td>
</tr>
<tr>
  <th>run-time injection (trap/exception)</th>
  <td>エラー発生タイミングで割り込みハンドラにジャンプさせる</td>
  <td>設計モデルがシンプルにできる</td>
  <td>処理中モジュールのパラメータ取得が難しい</td>
</tr>
<tr>
  <th>run-time injection (code insertion)</th>
  <td>エラー発生タイミングに追加処理を注入する</td>
  <td>特定の命令前にエラー発生させることができる</td>
  <td>ユーザモード実行なので、機能整合性の管理が煩雑になる</td>
</tr>
</table>

---

# まとめ

* Fault Injection の目的の実現方法（Pros and Cons）をまとめた
    * 目的：システム設計段階でのエラー発生モデルの検証。システム試験運用段階、運用段階でのとシステムエラー検証の補助
    * 実現方法：シミュレーション、プロトタイプ（ハードウェア、ソフトウェア両方）