通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学大学院情報理工学研究科 数理計算科学専攻 1 カーネルレベルロガーの必要性 カーネル内の競合が疑われるケースがある リモートログイン と バルク通信の競合 ネットワーク・カーネルの両方での競合の可能性 E.g.)ダウンロード中にリモートログインすると反応が遅い E.g.)CPUの競合により送受信処理が滞る カーネル内でログを取れることが必要 Tcpdumpなど既存のツールでは内部の処理が見えず不十分 write(2) read(2) カーネル } 見えない デバイス ネットワーク 2 Printfによるログ出力の問題点 コードを挿入するたびに再起動はしたくない コード挿入後再起動が必要で動作するまでに時間が かかる カーネル・ネットワークの状況が変わる 再起動時にメモリ内容、接続情報は消去される コード挿入作業は煩雑 入れ忘れるとコードを挿入し再起動 とり忘れると性能低下、情報漏えい n_time ip_time() { … printf(“%ld\n”,..); … 3 フラグによるログ出力切り替えの問題点 実行時オーバーヘッドが常にかかる ログ出力できる箇所が増えるとフラグチェックのオー バーヘッド大 そのオーバーヘッドを減らそうとすると十分なログが 取れない可能性がある ログ出力を細かく制御しようとするとフラグ数が n_time 爆発 ip_time() メモリ使用量大 フラグの構造化された 管理機構が必要 { if (flag1) printf(...); … if (flag2) printf(...); 4 カーネル用アスペクト指向システム ログコードと挿入箇所をアスペクトとして記述 アスペクトを動的に挿入、削除 カーネル本体から分離して記述できる 再起動不要 挿入箇所以外の実行時オーバーヘッドは低い アスペクトとしてまとめて関連箇所にコード挿入、 削除 入れ忘れやとり忘れを防ぎやすい Eg) *_output関数呼び出しの箇所すべて、など 5 アスペクトとは ポイントカット ログコード挿入できる箇所 (ジョインポイント)を指定 関数呼び出し 変数アクセスの指定 call/execution set/get アドバイス ポイントカットで指定した 位置に挿入するログコード ジョインポイントの例 n_time Iptime() 関数実行箇所 { … 関数呼び出し getmicrotime(&atv); t=… return (htonl(t)); } 変数への参照、代入 6 例: 特定箇所でロギング int ip_fastforward(struct mbuf *m) { … divert_packet(teem,..); … } void ip_input(struct mbuf *m) { … divert_packet(m,...); … } アスペクト ポイント カット aspect log_dequeue { pointcut call(“ void divert_packet( struct mbuf *m,int ..)”); before(struct mbuf *m) { logging(m); } } アドバイス divert_packetを呼んでいる位置の前で logging(m)を実行 7 例: データの追跡 void ip_input(struct mbuf *m) { …. m = m->m_next; … } void tcp_input(m, off0) { … for(; m && …) … } アスペクト ポイント カット aspect trace_mbuf { pointcut get(mbuf *m); before(mbuf *m) { logging(m); } } アドバイス Mbuf構造体の値を参照している位置の前で logging(m)を実行 8 アスペクトのカーネルへの適用(weave) アスペクト記述 1. ポイントカット位置の検索 2. ポイントカット位置とアドバイスの対応付け コンパイル OSカーネル weave アスペクト (カーネル内部表現) カーネル内表現 •ポイントカット記述子 •コンパイル済みアドバイス 9 Call/executionポイントカットの実現方法 関数呼び出し箇所、実行箇所にてアドバイスを 実行 実現方法: ブレークポイント トラップ(BPT) 実行時 (a) BPTの発生 Weave時 • 元の命令の保存 • BPTの挿入 BPT trap(..) { exec_advice() exec_inst() } (b)adviceの実行 (c)Weave時に 保存した命令の実行 10 ブレークポイントによる実現の利害 利点 実行フローを破壊しない Jmp/call命令(5byte命令)で実現すると飛び先を上書きする 恐れ mov $0x1, %eax Weaveした点以外の実行時間は不変 ブレークポイント命令は1byte命令 Weaveした点のみコード書き換え call func 0 … jmp label1 欠点 ブレークポイント命令の実行は遅い カーネルではプロセス間のコンテキストスイッチが 無い分だけ軽い 11 } Set/getポイントカットの実現方法 変数の代入、参照箇所でアドバイスを実行 デバッグレジスタによる実現 ポイントカットする変数のアドレスをデバッグレジスタに 登録 デバッグレジスタに格納されたアドレスへのアクセスでトラップ ページフォールト トラップによる実現 ポイントカット箇所の入ったページを書き込み/読み込み 禁止に設定 ページへの読み書きでページフォールトトラップ (b)割り込み (a)アクセス mbuf領域 Weave時に アクセス禁止設定 trap(..) { advice } 12 ページフォールトによる実現の利害 利点 ポインタによるアクセスにも対応可能 静的な解析ではわからない ポインタによる変数アクセスの箇所すべてでステップ実行が必要 欠点: 実行時オーバーヘッド 同一ページ内の関係ない変数アクセス時も発生 Mbuf全体への使用ではオーバーヘッド小 Mbuf領域は連続して確保 Mbuf領域はページあたりの個数が小 13 実験I: 割り込みと関数呼び出しの比較 関数呼び出し(call命令)、ブレークポイント割り込み(int3 命令)にかかる実行時間時間の比較 カーネル内部で実験 実験時はsti命令でその他の割り込みの禁止 実験環境 CPU: Athlon XP 2200+, Mem: 1GB FreeBSD 5.2.1R-p8 実験結果 Call命令 Int3命令 Getpid(2)システムコール 15 clocks 373 clocks 28,596 clocks 14 実験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 15 実験結果II: 割り込み挿入時のネット ワークの性能低下の調査 割り込みの数 00 10 0 80 0 60 0 40 0 (Mbps) 100 90 ス ル 80 ー 70 プ ッ 60 ト 50 40 30 20 10 0 20 300回以下の割り込み数 ではスループットの低下 無し 300回以上ではほぼ線形 に性能劣化 0 16 関連研究(1) Aspect指向言語 AspcetC++ [Olaf ’02] コンパイル時にweaveを行う 実行時に必要となった箇所へのログ埋め込みは不可 μDyner [Marc ’03] 動的にweaveを行う コンパイル時に関数の頭にnop命令を挿入しておく コンパイル時に決めた箇所のみweave可能 Nop命令の実行によりweaveしていない時でも性能劣化 17 関連研究(2) カーネルロガー LKST [畑崎 ’03]、 KTR 決められたイベントの箇所でのみログ出力可能 カーネルレベルでのコード挿入 Kerninstd [Ariel ’02] カーネル内のほぼ任意の箇所にコード挿入 基本ブロックの解析をしてjmp命令で実装 機械語レベルに挿入するので使いにくい 18 まとめ カーネル用アスペクト指向システムの提案 ブレークポイントトラップによりExecution/callポイントカットを実現 システムコール内部で呼んだ際に影響が少ないことを実験で確認 300回以下の場合にスループットに影響がほぼ無いことを実験で 確認 デバッグレジスタ、ページフォールトトラップによりSet/getポイントカッ トを実現 19 今後の課題 実装 性能評価 作成したシステムを用いてリモートログインとバルク 通信の競合を調査 データ構造が変化しても追跡してロギング E.g.) Network I/Oでは配列からmbufへのデータが変化 利用者からヒントをもらうとできる? 利用者は前後にポイントカットを挿入可能 20
© Copyright 2024 ExpyDoc