本を読む

読書やコンピュータなどに関するメモ

第79回カーネル読書会(Linux Fault Injection)に参加

 Linuxカーネルの勉強会「カーネル読書会」に参加した。お題は、「Linux Fault Injection」で、開発者(美田晃伸さん)本人が解説。人為的にメモリアロケーションなどのエラーを発生させて、Linuxカーネルがちゃんとエラーに対応できているかを確認する仕組み、らしい(←ちゃんと理解できてません)。

 Linux Foundation Symposiumのときと同じ話ではあるが、改めて受講メモ。会場からいろいろツッコミがあって勉強になった。

  • エラーをわざと起こしてエラーリカバリーコードが正常に動作するかテストする
  • Fault InjectionはWikipediaにもエントリーのある用語
  • Linuxカーネルで実装
  • エラーを意図的に発生させたい箇所にshould_fail()をしかける
  • エラーを発生させる確率やタイミングなどをdebugfsでコントロール
  • あらかじめ埋め込んだところ
    • スラブ・アロケータ
    • メモリ・アロケータ
    • I/O・アロケータ
  • スラブ・アロケータの場合
    • kmalloc()などのコアである_cache_alloc_node()にshould_fail()を埋め込む
    • should_fail()がTRUEなら失敗させる
  • もっと多数の場所に埋め込んだほうがいいという意見もある
    • が、これだけでもかなり有用
    • kmalloc()の呼び出し元や、さらに呼び出し元などにも影響を起こせる
  • mainlineのカーネルでmake menuconfigでオンにすれば使える
    • CONFIG_FAULT_INJECTION
  • debugfsで設定
    • probability:確率
    • interval:間隔
    • times:最大回数(-1で無制限)
    • require-start、require-end:特定のアドレス範囲のみエラーを発生
    • process-filter:/proc/make-it-failを設定したプロセスのみエラー
    • ignore-grp-wait:GFP_ATOMICだけ失敗させる(起こりやすいケース)
    • min-order:指定したサイズ以上のアロケーションのみ失敗させる(起こりやすいケース)
  • Q:probabilityとintervalの両方があるのは?
    • A:1%以下を設定するにはintervalで設定する
    • failmallocのやりかたをまねた
    • Q:エラーリカバリの制御などにも使える?
    • A:そこまでは考えてなかった
  • 例1:モジュールのロード/アンロード中のスタブアロケーションを5%の確率で失敗させる
    • modprobeとmodprobe -rを繰り返す
    • e100ドライバーでKernal BUGが発生
    • list corruption
    • sysfsの追加のときにメモリアロケーションのエラーを処理してない
    • e100ドライバー固有ではなくsysfsまわりの共通の問題
  • 例2:あるモジュールからのページアロケーションを1000回ごとに失敗させる
    • Fault Injectionを設定してモジュールに負荷をかける
  • 例3:CPU hotplugのエラー処理をテストする
    • いくつかバグが見付かった
    • 次のマージウィンドウで反映?
  • Fault Injectionで見つけられるのは、あくまでもエラー処理のバグだけ
    • 異常系のテストを徹底的にやる
  • Q:なぜ毎回エラーではいけない?
    • 条件の組み合わせが、高確率だとわかりづらい
    • うまくいっちゃう場合の裏をかく
  • 奥地さんのfailmallocに触発されて開発
  • アドバイスをくれた人
    • Andrew Morton
      • I/OリクエストのFaultに対応
      • 発生を動的にコントロール
    • Andi Kleen
      • 指定したプロセスやアドレス範囲のみエラー
    • Don Mills
      • スタックトレースをダンプ
      • ドキュメンテーション
  • よくある(あった)エラー処理の間違い
    • エラーチェック抜け
      • 直接のエラーチェック抜けは少ないが、関数の戻り値のチェックが抜けている場合がある
    • IS_ERR()でチェックすべきところを誤ってNULLチェックにしている
    • 返り値の間違い
      • モジュールの初期化関数で、エラーしたのに間違って成功値を返してしまっている
      • そのときはエラーにならず、モジュールのアンロードでエラーが起きる
    • ロールバックしわすれ
      • 失敗したときに、その直前に割り当てたリソースを開放していない
  • 美田さんが見つけたバグの数
    • 50個強ぐらい
    • 単純なものがけっこうある
  • Q:場所を確認するログは?
    • A:コールトレースをdmesgなどで確認
  • Q:失敗が起こるパターンとかの設定とかもあると面白いか
    • 初期と中期で確率を変える、など
    • エラーの組み合わせを定義する、など(コールバックを定義?)
    • でも、複雑にしないほうがいいのでは?
    • systemtapなら動的にフックできる(が、設定するのは大変。適材適所)

追記2007.8.31:タイトル修正。「第59回」→「第79回」

コメント

第79回ではないかと

詳細なレポートありがとうございます。
第59回カーネル読書会ではなくて、第79回カーネル読書会ではないかと。

修正しました

ありゃ、間違えてましたね。修正しました。ご指摘ありがとうございます。

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/277-17f35545

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad