OSカーネル用の アスペクト指向システム 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻 1 カーネルプロファイリング 動機: ネットワーク性能の劣化を調査 ダウンロード中にSSHのレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在 カーネルプロ ファイラが必要 プロファイル if_output write socket TCP IP datalink 2 従来の カーネルプロファイリング技術 測定粒度が固定 関数単位 – μDyner [Marc ’03], TOSKANA [Michael ’05] サポートされた種類のイベント – LKST [畑崎 ’03] 任意の粒度で測定 メモリ中のアドレスを直接指定 – KernInst [Ariel ’02] 構造体、ローカル変数、インライン関数、static関数、 マクロなどのアドレスが実行時に消失 3 プロファイルできない例 構造体メンバへの代入を逐一プロファイル mbuf構造体 - ネットワークI/Oで多用 tcp_output(…) struct mbuf { struct m_hdr m_hdr; { … struct mbuf *m; } m->m_len = hdrlen; #define m_len m_hdr.m_len … } アドレス情報はバイナリに欠如 アドレスの直指定はユーザに重荷 測定したい処理のアドレスを特定できない 4 KLAS (Kernel Level Aspectoriented System) Source-based binary-level dynamic weaving カーネル用アスペクト指向システム 動的にコード挿入 ソースレベルで挿入コードと位置を指定 アスペクトをXMLとして記述 再コンパイル・再起動が不要 任意の処理を指定可能 コンパイラの改造によりシンボル情報を拡張 実行時にweaverがシンボル情報を利用可能に 5 KLASにより指定可能となる処理 関数ポインタ呼び出し カーネル内のポリモル フィズム的コードで多用 E.g.) VFS、ファイル、ソ ケットなどの入出力 fo_read(…) { return ((*fp->f_ops->fo_read(…)); } データアクセス まとまったデータのやり 取りを行う箇所で多用 E.g.) mbuf、ファイル キャッシュの統計情報 tcp_input(…) { … m->m_len += hdrlen; m->m_data -= hdrlen; …. } 6 KLASの文法 m_lenへのアクセス をポイントカットとし て抽出 <aspect name=“log_reset_len”> <pointcut> <field-access name=“m_len” structure=“mbuf” /> </pointcut> <advice-before> struct timespec ts; nanotime(&ts); printf(“%d,%lld”, ts.tv_sec, ts.tv_nsec); </advice-before> </aspect> ポイントカット位置 で時間を表示 7 KLASの文法 m_lenへのアクセス をポイントカットとし て抽出 <aspect name=“log_reset_len”> <pointcut> <field-access name=“m_len” structure=“mbuf” /> </pointcut> <advice-before> tcp_output(…) struct timespec ts; { struct mbuf *m; nanotime(&ts); struct timespec ts; printf(…); ….. </advice-before> printf(…) </aspect> m->m_len = hdrlen; … 8 実装の概要 アスペクト (XML) OSソースコード - 測定点 - 測定点で実行するコード KLAS_gcc KLAS アドバイス ローダ アドレス リゾルバ フック 挿入 コンパイル済アドバイス シンボル 情報 フック シンボル情報抽出 OSカーネル (FreeBSD) コンパイル 9 KLAS_gccの実装 gccを改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 ip_output(…) { struct mbuf *m0; … m0->m_pkthdr … } 1 シンボル情報 ハッシュ表 2KLAS_gcc 1. 3 /usr/…/ip_output.c:879:mbuf.m_pkthdr ハッシュ表に構造体名、IDを保存 2. IDをキーにして構造体名を取得 3. ファイル名、行番号、構造体名、メ 10 ンバ名を出力 アドレスリゾルバ: メンバアクセスとアドレスの対応 構造体名、メンバ名を渡すと対応する ファイル名、行情報の一覧を得る 拡張シンボル情報を検索 ファイル名、行情報よりアドレスを得る バイナリに入っているデバッグ情報を調査 拡張シンボル情報 構造体名 メンバ名 … /usr/…put.c:175:ip.ip_v /usr/…put.c:176:ip.ip_hl … /usr/…257:mbuf.m_flags 35 debug_info 2 対応する ファイル名、行 0 4 1 “ip_output.c” “GNU C Compiler” “frodo:/usr/src/sys/…” … アドレス 11 アドバイスローダ: アドバイスのカーネル内部へのロード カーネルモジュール(KM)としてロード KMでは重複しない任意の関数をロード、使用可能 ヘッダ アドバイス フッタ #include <sys/types.h> #include <sys/module.h> … static int log_mbuf_loader(…) { … } int log_mbuf(….) { struct timespec ts; nanotime(&ts); printf(… ts.tv_nsec); } DECLARE_MODULE(…ANY); コンパイル済みアドバイス (カーネルモジュール) ロード(kldload) OSカーネル 12 フック挿入: カーネルへのフック埋め込み ブレークポイントトラップ(BPT)をフックに使用 x86では1byte命令で実行フローを破壊しない 動作 3.BPT挿入 BPT フック挿入 コンパイル済みアドバイス 1.アドバイスのアドレスを取得 アドレスマップ 2.アドレスマップに登録 13 フック挿入: カーネルへのフック埋め込み ブレークポイントトラップ(BPT)をフックに使用 x86では1byte命令で実行フローを破壊しない 動作 (フック作動時) BPT 1.処理が遷移 フック挿入 トラップ処理ルーチン 3.アドバイスを実行 2.対応アドバイス コンパイル済みアドバイス の確認 アドレスマップ 14 実験I:カーネルコンパイル時間 実験内容 KLAS_gccのオーバーヘッドを測定 実験環境 KLAS_gcc、gccのカーネルコンパイル時間を比較 CPU: AMD Athlon 2200+, Mem: 1GB, HDD: UDMA133, gcc: 3.4.2 実験結果 総実行時間(秒) gcc KLAS_gcc 243.86 260.43 User System 212.98 218.44 約7%実行時間が増加 User: 約3%, System: 約38% 29.16 40.13 15 実験II: フック数と実行時間 目的 実験結果 実験環境: FreeBSD 5.2.1 フックの数と実行時間の 変化を調査 実験内容 実験用システムコールの 実行時間を測定 システムコール内で千個 の関数を順に呼び出し 各関数に挿入するフック は高々1つ フック数 フックにより実行するコー ド内容は空 フックの処理にDDBを利用した実装が原因 16 DDBはフック処理時に全BPTを消去、復帰 経過時間(s) 関連研究(1) アスペクト指向システム AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可 μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定 ポイントカット可能位置の増加でコードサイズが増加 TOSKANA [Michael ’05] NetBSDカーネルに実装されたアスペクト指向システム 関数の開始、終了位置にてフック埋め込みを実施 関数の粒度より細粒度のフック埋め込みは不可 17 従来の C/C++用アスペクト指向システム 動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定的 関数の先頭のみをポイントカットとして指定可能 コンパイル時に構造体、マクロの情報が消失 静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに 再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下 KLASではシンボル情報を拡張し、実行時に構造体をポイントカット可能 18 関連研究(2) カーネルプロファイラ LKST [畑崎 ’03] 決められたイベントの箇所でログ出力可能 KLASは関数呼び出し、構造体アクセスでログ出力可能 カーネルコード変換 KernInst [Ariel ’02] カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 挿入するコードの指定が機械語に近く、煩雑 KLASはソースレベルの情報で指定可能 19 まとめ カーネル用アスペクト指向システムKLASの提案 FreeBSD、gccを改造して実装 ソースコードを参照し、実行中のバイナリにフック埋め込み コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとしてBPTを使用 実験 カーネルコンパイル時間が約7%増加することがわかった フックの数に対して非線形に消費時間が増加することがわ かった 20 今後の課題 フックの処理時間の改善 フック可能な処理を増加 実装の変更による所要オーダーの軽減 高速化のためにKerninstベースの開発を検討 インライン関数、マクロに対応 フックをより正確な位置に挿入 コンパイラの改良により行よりも細かい単位でフック挿入 最適化により消える命令の取り扱いを検討 21
© Copyright 2025 ExpyDoc