通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
ファイルキャッシュを考慮したディスク監視のオフロード
Chapter11-4(前半) 加藤健.
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
クラウドにおける ネストした仮想化を用いた 安全な帯域外リモート管理
IaaS 仮想マシン(VM)をネットワーク経由で提供 負荷に応じてVM数や性能を変更できる ハードウェアの導入・管理・維持コストの削減
中村孝介(九州工業大学) 光来健一(九州工業大学/JST CREST)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻
App. A アセンブラ、リンカ、 SPIMシミュレータ
OSが乗っ取られた場合にも機能するファイルアクセス制御システム
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
AspectScope によるアスペクトとクラスのつながりの視覚化
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネストした仮想化を用いた VMの安全な帯域外リモート管理
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
アスペクト指向プログラミングを用いたIDSオフロード
サスペンドした仮想マシンの オフラインアップデート
柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻
型付きアセンブリ言語を用いた安全なカーネル拡張
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
分散IDSの実行環境の分離 による安全性の向上
他のプロセスに あたえる影響が少ない 実行時ミラーリングシステム
IaaS型クラウドにおける インスタンス構成の動的最適化手法
リモートホストの異常を検知するための GPUとの直接通信機構
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
複数ホストに分割されたメモリを用いる仮想マシンの監視機構
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
東京工業大学 情報理工学研究科 数理・計算科学専攻 千葉研究室 栗田 亮
OSカーネル用 アスペクト指向システム KLASY
XenLASY: XenのI/O処理を 追跡するための アスペクト指向プロファイラ
カーネル用アスペクト指向システム KLAS
IaaS環境におけるVMのメモリ暗号化による情報漏洩の防止
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
ウェブアプリケーションサーバの Degradation Schemeの 制御に向けて
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
仮想環境を用いた 侵入検知システムの安全な構成法
Cell/B.E.のSPE Isolationモードを用いた監視システム
統合開発環境によって表現された 言語機構によるコードのモジュール化
実装について 前田俊行.
同期処理のモジュール化を 可能にする アスペクト指向言語
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
開発者との対話を活かした 横断的構造の表現
強制パススルー機構を用いた VMの安全な帯域外リモート管理
SMP/マルチコアに対応した 型付きアセンブリ言語
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
強制パススルー機構を用いた VMの安全な帯域外リモート管理
Josh : バイトコードレベルでのJava用 Aspect Weaver
プログラミング 2 静的変数.
Presentation transcript:

通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学大学院情報理工学研究科 数理計算科学専攻

} カーネルレベルロガーの必要性 カーネル内の競合が疑われるケースがある カーネル内でログを取れることが必要 カーネル ネットワーク リモートログイン と バルク通信の競合 E.g.)ダウンロード中にリモートログインすると反応が遅い ネットワーク・カーネルの両方での競合の可能性 E.g.)CPUの競合により送受信処理が滞る カーネル内でログを取れることが必要 Tcpdumpなど既存のツールでは内部の処理が見えず不十分 write(2) read(2) } カーネル 見えない デバイス ネットワーク

Printfによるログ出力の問題点 コードを挿入するたびに再起動はしたくない コード挿入作業は煩雑 コード挿入後再起動が必要で動作するまでに時間がかかる カーネル・ネットワークの状況が変わる 再起動時にメモリ内容、接続情報は消去される コード挿入作業は煩雑 入れ忘れるとコードを挿入し再起動 とり忘れると性能低下、情報漏えい n_time ip_time() { … printf(“%ld\n”,..);

フラグによるログ出力切り替えの問題点 実行時オーバーヘッドが常にかかる ログ出力を細かく制御しようとするとフラグ数が爆発 ログ出力できる箇所が増えるとフラグチェックのオーバーヘッド大 そのオーバーヘッドを減らそうとすると十分なログが取れない可能性がある ログ出力を細かく制御しようとするとフラグ数が爆発 メモリ使用量大 フラグの構造化された 管理機構が必要 n_time ip_time() { if (flag1) printf(...); … if (flag2)

カーネル用アスペクト指向システム ログコードと挿入箇所をアスペクトとして記述 アスペクトを動的に挿入、削除 カーネル本体から分離して記述できる アスペクトを動的に挿入、削除 再起動不要 挿入箇所以外の実行時オーバーヘッドは低い アスペクトとしてまとめて関連箇所にコード挿入、削除 入れ忘れやとり忘れを防ぎやすい Eg) *_output関数呼び出しの箇所すべて、など

アスペクトとは ポイントカット アドバイス ジョインポイントの例 ログコード挿入できる箇所(ジョインポイント)を指定 関数呼び出し call/execution 変数アクセスの指定 set/get アドバイス ポイントカットで指定した 位置に挿入するログコード ジョインポイントの例 n_time Iptime() { … getmicrotime(&atv); t = … return (htonl(t)); } 関数実行箇所 関数呼び出し 変数への参照、代入

divert_packetを呼んでいる位置の前で 例: 特定箇所でロギング ポイントカット アスペクト int ip_fastforward(struct mbuf *m) { … divert_packet(teem,..); } aspect log_dequeue { } pointcut call(“ void divert_packet( struct mbuf *m,int ..)”); before(struct mbuf *m) { logging(m); } void ip_input(struct mbuf *m) { … divert_packet(m,...); } アドバイス divert_packetを呼んでいる位置の前で logging(m)を実行

Mbuf構造体の値を参照している位置の前で 例: データの追跡 ポイントカット アスペクト void ip_input(struct mbuf *m) { …. m = m->m_next; … } aspect trace_mbuf { } pointcut get(mbuf *m); before(mbuf *m) { logging(m); } void tcp_input(m, off0) { … for(; m && …) } アドバイス Mbuf構造体の値を参照している位置の前で logging(m)を実行

アスペクトのカーネルへの適用(weave) アスペクト記述 OSカーネル ポイントカット位置の検索 ポイントカット位置とアドバイスの対応付け コンパイル weave アスペクト (カーネル内部表現) カーネル内表現 ポイントカット記述子 コンパイル済みアドバイス

Call/executionポイントカットの実現方法 関数呼び出し箇所、実行箇所にてアドバイスを実行 実現方法: ブレークポイント トラップ(BPT) 実行時 (a) BPTの発生 Weave時 元の命令の保存 BPTの挿入 BPT trap(..) { exec_advice() exec_inst() } (b)adviceの実行 (c)Weave時に 保存した命令の実行

} ブレークポイントによる実現の利害 利点 欠点 実行フローを破壊しない 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 実験結果 Call命令 15 clocks Int3命令 373 clocks Getpid(2)システムコール 28,596 clocks

実験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) 割り込みの数

関連研究(1) Aspect指向言語 AspcetC++ [Olaf ’02] μDyner [Marc ’03] コンパイル時にweaveを行う 実行時に必要となった箇所へのログ埋め込みは不可 μDyner [Marc ’03] 動的にweaveを行う コンパイル時に関数の頭にnop命令を挿入しておく コンパイル時に決めた箇所のみweave可能 Nop命令の実行によりweaveしていない時でも性能劣化

関連研究(2) カーネルロガー カーネルレベルでのコード挿入 LKST [畑崎 ’03]、 KTR 決められたイベントの箇所でのみログ出力可能 カーネルレベルでのコード挿入 Kerninstd [Ariel ’02] カーネル内のほぼ任意の箇所にコード挿入 基本ブロックの解析をしてjmp命令で実装 機械語レベルに挿入するので使いにくい

まとめ カーネル用アスペクト指向システムの提案 ブレークポイントトラップによりExecution/callポイントカットを実現 システムコール内部で呼んだ際に影響が少ないことを実験で確認 300回以下の場合にスループットに影響がほぼ無いことを実験で確認 デバッグレジスタ、ページフォールトトラップによりSet/getポイントカットを実現

今後の課題 実装 性能評価 作成したシステムを用いてリモートログインとバルク通信の競合を調査 データ構造が変化しても追跡してロギング E.g.) Network I/Oでは配列からmbufへのデータが変化 利用者からヒントをもらうとできる? 利用者は前後にポイントカットを挿入可能