180 likes | 332 Views
カーネル用アスペクト指向システム KLAS. 柳澤 佳里* 光来 健一* 千葉 滋* 石川 零* *東京工業大学 情報理工学研究科. カーネルプロファイラは必要. カーネルのパフォーマンス向上は重要 近年でも OS の性能を向上する改良は行われる FreeBSD 、 Linux のスケジューラの改良 FreeBSD 、 Linux のロック粒度の改善 TUX HTTP Server … など 性能向上には劣化させているコードの発見が第一 劣化させているところを改善したほうが費用対効果が大きい 劣化しているところがわからないと改良しようがない.
E N D
カーネル用アスペクト指向システム KLAS 柳澤 佳里* 光来 健一* 千葉 滋* 石川 零* *東京工業大学 情報理工学研究科
カーネルプロファイラは必要 • カーネルのパフォーマンス向上は重要 • 近年でもOSの性能を向上する改良は行われる • FreeBSD、Linuxのスケジューラの改良 • FreeBSD、Linuxのロック粒度の改善 • TUX HTTP Server…など • 性能向上には劣化させているコードの発見が第一 • 劣化させているところを改善したほうが費用対効果が大きい • 劣化しているところがわからないと改良しようがない
従来のカーネルプロファイラの問題 • プロファイリングを行える点が限定的 • 指定されたイベントにて調査 • 関数の開始、終了点にて調査 • プロファイリングを行う点の構造化が困難 • プロファイリングをする箇所のソースコードに記述 • ソースコードにロジックに関係がないコードが混在し、可読性が低下 • 開発中に十分なモジュール化が必要だが、困難
カーネル用アスペクト指向システム: KLAS • 動的アスペクト指向システム • アスペクトでプロファイリングの箇所、コードを指定 • 粒度の細かい構造化されたプロファイリング箇所の指定が可能 • Source-based binary-level dynamic weavingにより、構造体メンバーへのアクセスをポイントカット可能 • カーネルを停止せずにプロファイリングの開始、終了が可能 • カーネルの停止、再起動による状態の消失がない • 再現に時間がかかる問題のプロファイリングに有利
KLASのアスペクト例 <aspect> <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” … アドレス ファイル名 行番号 構造体メンバー アクセス
ウィーバー: トランポリンの作成 • トランポリンを用いてジョインポイントのコンテキストを利用 • 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カーネル コンパイル済みアドバイス フック トランポリン
実験 • 実験環境 • 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の比較 トランポリン使用 フックの 種類
使用例:ネットワーク 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のオーバーヘッドが少ないことを確認 • コンテキストを利用してもフックのオーバーヘッドは最大で200ナノ秒程度 • UnixBenchにより性能が1割程度劣化する場合があることを確認した • KLASの利用例の提示 • sk_buffに基づいたネットワーク I/Oのトレース • 今後の課題 • 実装の洗練 • さらなる応用例の発見