カーネル用アスペクト指向システム KLAS

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

ファイルキャッシュを考慮したディスク監視のオフロード
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
クラウドにおける ネストした仮想化を用いた 安全な帯域外リモート管理
通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー
柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
F11: Analysis III (このセッションは論文2本です)
ファイルシステムキャッシュを 考慮したIDSオフロード
AspectScope によるアスペクトとクラスのつながりの視覚化
ネストした仮想化を用いた VMの安全な帯域外リモート管理
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻
型付きアセンブリ言語を用いた安全なカーネル拡張
過負荷時の分散ソフトウェアの 性能劣化を改善する スケジューリングの提案
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
仮想マシン間にまたがる プロセススケジューリング
Xenによる ゲストOSの監視に基づく パケットフィルタリング
暗黙的に型付けされる構造体の Java言語への導入
数理・計算科学専攻 千葉研究室 08M37315 森田 悟史 指導教員 千葉 滋 教授
他のプロセスに あたえる影響が少ない 実行時ミラーリングシステム
統合開発環境のための アスペクト指向システム
リモートホストの異常を検知するための GPUとの直接通信機構
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
デバッガ dbx の使い方.
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
複数ホストに分割されたメモリを用いる仮想マシンの監視機構
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
通信機構合わせた最適化をおこなう並列化ンパイラ
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
東京工業大学 情報理工学研究科 数理・計算科学専攻 千葉研究室 栗田 亮
OSカーネル用 アスペクト指向システム KLASY
XenLASY: XenのI/O処理を 追跡するための アスペクト指向プロファイラ
他のプロセスに与える影響の少ない 実行時ミラーリングシステム
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
Intel SGXを用いた仮想マシンの 安全な監視機構
アスペクト指向言語のための 独立性の高いパッケージシステム
信頼できないクラウドにおける仮想化システムの監視機構
ソフトウェア保守のための コードクローン情報検索ツール
ウェブアプリケーションサーバの Degradation Schemeの 制御に向けて
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
Cell/B.E.のSPE Isolationモードを用いた監視システム
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
実装について 前田俊行.
同期処理のモジュール化を 可能にする アスペクト指向言語
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
Cell/B.E. のSPE上で動作する 安全なOS監視システム
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
アスペクト指向プログラミングの 動的プログラムスライスへの応用
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
開発者との対話を活かした 横断的構造の表現
強制パススルー機構を用いた VMの安全な帯域外リモート管理
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Presentation transcript:

カーネル用アスペクト指向システム KLAS 柳澤 佳里* 光来 健一* 千葉 滋* 石川 零* *東京工業大学 情報理工学研究科

カーネルプロファイラは必要 カーネルのパフォーマンス向上は重要 近年でもOSの性能を向上する改良は行われる FreeBSD、Linuxのスケジューラの改良 FreeBSD、Linuxのロック粒度の改善 TUX HTTP Server…など 性能向上には劣化させているコードの発見が第一 劣化させているところを改善したほうが費用対効果が大きい 劣化しているところがわからないと改良しようがない

従来のカーネルプロファイラの問題 プロファイリングを行える点が限定的 プロファイリングを行う点の構造化が困難 指定されたイベントにて調査 関数の開始、終了点にて調査 プロファイリングを行う点の構造化が困難 プロファイリングをする箇所のソースコードに記述 ソースコードにロジックに関係がないコードが混在し、可読性が低下 開発中に十分なモジュール化が必要だが、困難

カーネル用アスペクト指向システム: KLAS 動的アスペクト指向システム アスペクトでプロファイリングの箇所、コードを指定 粒度の細かい構造化されたプロファイリング箇所の指定が可能 Source-based binary-level dynamic weaving により、構造体メンバーへのアクセスをポイントカット可能 カーネルを停止せずにプロファイリングの開始、 終了が可能 カーネルの停止、再起動による状態の消失がない 再現に時間がかかる問題のプロファイリングに有利

KLASのアスペクト例 <aspect> int inode_change_ok(…) <import>linux/time.h</import> <advice><pointcut> access(inode.i_uid) AND within_function(inode_change_ok) AND target(inode_value) </pointcut> <before> struct inode *i = (struct inode *)inode_value; struct timeval tv; do_gettimeofday(&tv); printk(“inode.i_uid: %d at %d.%d\n”, i->uid, tv.tv_sec, tv.tv_usec); </before></advice> </aspect> int inode_change_ok(…) { … if ((ia_valid & ATTR_UID) && … attr->ia_uid != inode->i_uid) … goto error; if ((ia_valid & ATTR_GID) && } ポイントカット フック ポイントカット箇所 inode構造体のi_uidメンバーへの アクセスをポイントカット アクセス時間を記録するアドバイスを実行 アドバイス

KLASのアスペクト ポイントカット:プロファイリング実施点の指定 アドバイス: 実行するプロファイリングのコード execution: 関数実行点を指定 args: executionで指定した関数の引数を指定 access: 構造体メンバーアクセスの行頭を指定 target: accessで指定した構造体を指定 local: accessで指定した箇所のローカル変数を指定 アドバイス: 実行するプロファイリングのコード

実装 (Overview) OS アスペクト ソースコード KLAS Cコンパイラ アスペクトコンパイラ シンボル情報 ポイントカット デバッグ情報 ポイントカット ウィーバー OSカーネル コンパイル済みアドバイス OSカーネル 本体 トランポリン フック

KLAS Cコンパイラ: コンパイル時の動作 コンパイル時にシンボル情報を収集 改造したgccにより、構造体メンバーへのアクセスをしたファイル名、行番号を記録 改造したgccにより、構造体の名前、アクセス方法を記録 Gcc、gasの改造により、最適化による行番号と アドレスのマッピング情報の消失を抑制 通常のGcc、gasはアドレスに対応する行を1つだけ記録 ヘッダファイル中のメンバアクセスの行情報が消失 if ((ia_valid & ATTR_UID) && attr->ia_uid != inode->i_uid) … goto error; if ((ia_valid & ATTR_GID) && inode.i_uid:fs/attr.c:31,inode &(*(*(struct inode **)inode)) KLAS gcc/gas シンボル情報 デバッグ情報 fs/attr.c:31 0xc010ccbb

ウィーバー: フック挿入アドレスの解決 構造体メンバーアクセスに対応するファイル名、行番号を調査 コンパイラの作ったデバッグ情報を用いて、ファイル名、行番号に相当するアドレスを解決 コンパイラの作ったシンボル情報により、ジョインポイント変数の アクセス方法を特定 シンボル情報 デバッグ情報 … fs/attr.c:31:inode,’(*(*struct inode **)inode)):inode.i_uid fs/attr.c:31:attr,&(*(*(struct iattr **)attr)):iattr.ia_uid fs/attr.c:31:inode,&(*(*struct inode **)inode)):inode.i_uid fs/attr.c:37:inode,&(*(*(struct inode **)inode)):inode.i_uid ... 35 2 0 4 1 “fs/attr.c” “GNU C Compiler” … アドレス ファイル名 行番号 構造体メンバー アクセス

ウィーバー: トランポリンの作成 トランポリンを用いてジョインポイントのコンテキストを利用 例) ローカル変数attrを参照 target、local、argsポイントカットを実現 デバッグ情報より変数の格納位置を特定 例) ローカル変数attrを参照 トランポリン void trampoline_c017e50b(unsigned long addr) { void ***ebp, *ecx; __asm__ __volatile(“movl %%ecx, %0”: “=r”(ecx)); … void *arg0 = &(ebp[3 + (8 – 7)]); advice(ecx, arg0); } デバッグ情報 DW_AT_name: inode_change_ok DW_AT_low_pc: 0xc017e494 DW_AT_high_pc: 0xc017e5b9 Abbrev Number: 53 (DW_TAG_formal_parameter) DW_AT_name: attr DW_AT_location: 1 byte block: 53 (DW_OP_reg7) …

ウィーバー: フックの挿入 Kerninst [Ariel et al. ’99]を利用して動的にフック挿入 APIを用いてフック挿入箇所のアドレス、呼び出すトランポリンコードを指示 APIを用いてフックが有効な位置に入っているか調査 フックは挿入される位置の機械語長で変化 5バイト以上: jmp命令 4バイト以下: int3命令(ブレークポイントトラップ) ウィーバー Kerninst OSカーネル コンパイル済みアドバイス フック トランポリン

実験 実験環境 目的 KLASを利用した際のオーバーヘッドを測定 KLASのフックのオーバーヘッドを測定 CPU: AMD Athlon XP 1800+、Mem: 1GB Fedora Core 2 Linux (2.6.10 kernel) GNU C Compiler 3.3.3、Kerninst 2.1 目的 KLASを利用した際のオーバーヘッドを測定 KLASのフックのオーバーヘッドを測定 UnixBenchを用いてKLAS gccでコンパイルされたカーネルのオーバーヘッドを測定 KLASは変数値の取得のためにフレームポインタを使用 KLASはデバッグ情報を作成

実験結果 フックのオーバーヘッド (ナノ秒) UnixBenchによるKLAS gccと通常gccの比較 no register frame トランポリン使用 no register frame jmp 16 18 19 int3 200 202 203 フックの 種類 dhry2reg execl pipe context 通常 397.6 708.5 872.6 731.1 KLAS 397.2 735.4 803.8 717.8 オーバーヘッド -3.7 8.6 1.9

使用例: ネットワーク I/Oのプロファイリング 得られたログ (生データ) 使用したアスペクト 8684196258043, 0xc02db384, 0xf6b03420 8684196258614, 0xc02db3a1, 0xf6b03420 8684196259462, 0xc02db3d7, 0xf6b03420 8684196259661, 0xc02db3e7, 0xf6b03420 8684196260215, 0xc02db3ff, 0xf6b03420 8684196260807, 0xc02da4da, 0xf6b03420 … <aspect><import>linux/skbuff.h</import> <import>linux/netdevice.h</import> <advice><pointcut> access(sk_buff.%) AND target(arg0) </pointcut> <before> struct sk_buff *skb = (struct sk_buff *)arg0; unsigned long long timestamp; if (skb->>protocol != ETH_P_ARP) { DO_RDTSC(timestamp); STORE_DATA(timestamp); STORE_DATA($pc$); STORE_DATA(arg0);} </before></advice></aspect> 解析結果 関数名  ファイル名 行番号 経過時間 e1000_rx_checksum e1000_main.c 2773 0.00 1000_clean_rx_irq eth.c 2434 0.34 eth_type_trans dev.c 164 0.47 netif_receive_skb dev.c 1638 1.06 netif_rx dev.c 1500 1.68 ip_rcv ip_input.c 367 3.43 ip_rcv_finish ip_input.c 287 4.83 ip_local_deliver ip_input.c 275 5.56 ip_local_deliver_finish ip_input.c 201 6.02 tcp_v4_rcv tcp_ipv4.c 1741 6.84 tcp_v4_do_rcv tcp_ipv4.c 1688 10.83 tcp_rcv_established tcp_input.c 4238 11.14 tcp_measure_rcv_mss tcp_input.c 140 12.46 tcp_event_data_recv tcp_input.c 554 13.36 tcp_grow_window tcp_input.c 268 13.68 tcp_rcv_established tcp_input.c 4355 14.23 skb_copy_datagram_iovec datagram.c 234 25.93 __kfree_skb skbuff.c 225 27.14

関連研究: カーネル用システム 実行時コード挿入システム トレーサー/プロファイラー 実行時に指定された位置にフックを挿入 コード挿入の指定が機械語粒度で使いにくい Kerninst [Ariel et al. ’99] GILK [David et al. ’02] トレーサー/プロファイラー イベント、関数開始終了点でログ取得、コード実行 指定するイベントの構造化が困難 LTT [Karim et al. ’00] Dtrace [Bryan et al. ’04] SystemTAP [Vara et al. ’05]

関連研究: C言語用アスペクト指向システム 静的アスペクト指向システム ウィーブ、アンウィーブにシステムの停止が必要 AspectC [Yvonne et al. ’03] AspectC++ [Olaf et al. ’02] 動的アスペクト指向システム 実行時にアスペクトをウィーブ、アンウィーブ コンパイル時の情報を用いない 構造体のメンバーアクセスをポイントカット不可 μDyner [Marc et al. ’03] Arachne [Remi et al. ’05] TOSKANA [Michael et al. ’05]

落ち穂拾い KLASはカーネル限定か? なぜプロファイリングにアスペクト指向か? ユーザーランドの動的アスペクト指向システムにも応用可能 カーネルは停止の影響が大きい カーネルは構造体の利用が多い なぜプロファイリングにアスペクト指向か? プログラムの構造を考慮したモジュール化が可能 構造化のための特別なコードや下準備が不要

まとめと今後の課題 まとめ 今後の課題 KLASの提案 実験でKLASのオーバーヘッドが少ないことを確認 KLASの利用例の提示 実装の洗練 プロファイリングのコードをアスペクトとして記述 動的にウィーブ・アンウィーブが可能 構造体のメンバーをポイントカット可能 ポイントカットした箇所のコンテキストを利用可能 実験でKLASのオーバーヘッドが少ないことを確認 コンテキストを利用してもフックのオーバーヘッドは最大で200ナノ秒程度 UnixBenchにより性能が1割程度劣化する場合があることを確認した KLASの利用例の提示 sk_buffに基づいたネットワーク I/Oのトレース 今後の課題 実装の洗練 さらなる応用例の発見