160 likes | 290 Views
OS カーネル用 アスペクト指向システムの 設計・実装方法. 柳澤 佳里* 光来 健一* 千葉 滋* * 東京工業大学大学院情報理工学研究科 数理計算科学専攻. カーネル用アスペクト指向システム の必要性. 通信処理の詳細なログ出力を楽に取れるシステムがほしい カーネル内の処理の流れに沿って経過時間を調査したい E.g.) システムコールからデバイスまでの処理をプロファイリング 関数出入り時にログをとるシステムがほしい 特定の関数呼び出しで panic する原因を調査したい. カーネル用アスペクト指向システム. ログコードと挿入箇所をアスペクトとして記述
E N D
OSカーネル用アスペクト指向システムの設計・実装方法OSカーネル用アスペクト指向システムの設計・実装方法 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学大学院情報理工学研究科 数理計算科学専攻
カーネル用アスペクト指向システムの必要性 • 通信処理の詳細なログ出力を楽に取れるシステムがほしい • カーネル内の処理の流れに沿って経過時間を調査したい E.g.) システムコールからデバイスまでの処理をプロファイリング • 関数出入り時にログをとるシステムがほしい • 特定の関数呼び出しでpanicする原因を調査したい
カーネル用アスペクト指向システム • ログコードと挿入箇所をアスペクトとして記述 • カーネル本体から分離して記述できる • アスペクトを動的に挿入、削除 • 再起動不要 • 挿入箇所以外の実行時オーバーヘッドは低い • アスペクトとしてまとめて関連箇所にコード挿入、削除 • 入れ忘れやとり忘れを防ぎやすい • Eg) *_output関数呼び出しの箇所すべて、など
カーネル用アスペクト指向システムの概要 アスペクト記述 OSカーネル • ポイントカット位置の検索 • ポイントカット位置とアドバイスの対応付け コンパイル weave アスペクト (カーネル内部表現) • カーネル内表現 • ポイントカット記述子 • コンパイル済みアドバイス
Call/executionポイントカットの実現方法 • 関数呼び出し箇所、実行箇所にてアドバイスを実行 • 実現方法: ブレークポイント トラップ(BPT) 実行時 (a) BPTの発生 • Weave時 • 元の命令の保存 • BPTの挿入 BPT trap(..) { exec_advice() exec_inst() } (b)adviceの実行 (c)Weave時に 保存した命令の実行
ブレークポイントによる実現の利害 • 利点 • 実行フローを破壊しない • Jmp/call命令(5byte命令)で実現すると飛び先を上書きする恐れ • ブレークポイント命令は1byte命令 • Weaveした点以外の実行時間は不変 • Weaveした点のみコード書き換え • 欠点 • ブレークポイント命令の実行は遅い • カーネルではプロセス間のコンテキストスイッチが無い分だけ軽い } mov $0x1, %eax call func 0 … jmp label1
Set/getポイントカットの実現方法 • 変数の代入、参照箇所でアドバイスを実行 • デバッグレジスタによる実現 • ポイントカットする変数のアドレスをデバッグレジスタに登録 • デバッグレジスタに格納されたアドレスへのアクセスでトラップ • ページフォールト トラップによる実現 • ポイントカット箇所の入ったページを書き込み/読み込み禁止に設定 • ページへの読み書きでページフォールトトラップ (b)割り込み trap(..) { advice} mbuf領域 (a)アクセス Weave時に アクセス禁止設定
ページフォールトによる実現の利害 • 利点 • ポインタによるアクセスにも対応可能 • 静的な解析ではわからない • ポインタによる変数アクセスの箇所すべてでステップ実行が必要 • 欠点: 実行時オーバーヘッド • 同一ページ内の関係ない変数アクセス時も発生 • Mbuf全体への使用ではオーバーヘッド小 • Mbuf領域は連続して確保 • Mbuf領域はページあたりの個数が小
実験I: 割り込みと関数呼び出しの比較 • 関数呼び出し(call命令)、ブレークポイント割り込み(int3命令)にかかる実行時間時間の比較 • カーネル内部で実験 • 実験時はsti命令でその他の割り込みの禁止 • 実験環境 • CPU: Athlon XP 2200+, Mem: 1GB • FreeBSD 5.2.1R-p8 • 実験結果
実験II: 割り込み挿入時のネットワーク処理性能 • ブレークポイント割り込み挿入時のTCPスループットを測定 • ip_outputへのint3の埋め込み数を変えて実験 OS: FreeBSD 5.2R CPU: Athlon 2200+ Mem: 1GB NIC: Intel Ethernet Pro OS: FreeBSD 4.10R CPU: Athlon 2200+ Mem: 1GB NIC: Intel Ethernet Pro Network 100Mbps switching-HUB
実験結果II: 割り込み挿入時のネットワークの性能低下の調査 • 300回以下の割り込み数ではスループットの低下無し • 300回以上ではほぼ線形に性能劣化 スループット(Mbps) 割り込みの数
まとめ • カーネル用アスペクト指向システムの提案 • ブレークポイントトラップによりExecution/callポイントカットを実現 • デバッグレジスタ、ページフォールトトラップによりSet/getポイントカットを実現
今後の課題 • 実装 • 性能評価 • 作成したシステムを用いてリモートログインとバルク通信の競合を調査 • データ構造が変化しても追跡してロギング • E.g.) Network I/Oでは配列からmbufへのデータが変化 • 利用者からヒントをもらうとできる? • 利用者は前後にポイントカットを挿入可能
関連研究(1) • Aspect指向言語 • AspcetC++ [Olaf ’02] • コンパイル時にweaveを行う • 実行時に必要となった箇所へのログ埋め込みは不可 • μDyner [Marc ’03] • 動的にweaveを行う • コンパイル時に関数の頭にnop命令を挿入しておく • コンパイル時に決めた箇所のみweave可能 • Nop命令の実行によりweaveしていない時でも性能劣化
関連研究(2) • カーネルロガー • LKST [畑崎 ’03]、 KTR • 決められたイベントの箇所でのみログ出力可能 • カーネルレベルでのコード挿入 • Kerninstd [Ariel ’02] • カーネル内のほぼ任意の箇所にコード挿入 • 基本ブロックの解析をしてjmp命令で実装 • 機械語レベルに挿入するので使いにくい