動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use) 柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻 1 カーネルプロファイリング 動機: ネットワーク性能の劣化を調査 ダウンロード中にSSHのレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネルプロ ファイラが必要 カーネル内にボトルネック? 疑わしい場所は無数に存在 プロファイル if_output write socket TCP IP datalink 2 従来のカーネルプロファイリング技術 測定粒度が固定 関数単位 – μDyner [Marc ’03] サポートされた種類のイベント – 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 name=“m_len” structure=“mbuf” /> </pointcut> <advice> struct timespec ts; nanotime(&ts); printf(“%d,%lld”, ts.tv_sec, ts.tv_nsec); </advice> </aspect> ポイントカット位置 で時間を表示 7 KLASの文法 m_lenへのアクセス をポイントカットとし て抽出 <aspect name=“log_reset_len”> <pointcut> <field name=“m_len” structure=“mbuf” /> </pointcut> <advice> tcp_output(…) struct timespec ts; { struct mbuf *m; nanotime(&ts); struct timespec ts; printf(…); ….. </advice> printf(…) </aspect> m->m_len = hdrlen; … 8 実装の概要 アスペクト (XML) OSソースコード KLAS_gcc KLAS アドバイス ローダ アドレス リゾルバ フック 挿入 コンパイル済アドバイス シンボル 情報 フック シンボル情報抽出 OSカーネル (FreeBSD) コンパイル 9 KLAS_gccの実装 gcc 3.3.4を改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 ip_output(…) { struct mbuf *m0; … m0->m_pkthdr … } 1 シンボル情報 ハッシュ表 2 KLAS_gcc 3 /usr/…/ip_output.c:879:mbuf.m_pkthdr 1. ハッシュ表に構造体名、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 KLAS_gcc 294.25 527.86 User System 211.72 223.06 System時間が大きい I/Oオーバーヘッドが原因? 79.54 301.07 15 実験II: フック数と実行時間 目的 実験結果 フックの数と実行時間の 変化の調査 実験内容 システムコールの実行時 間を測定 システムコール内で千個 の関数を順に呼び出し 各関数に挿入するアスペ クトは高々1つ アドバイス内容は空 非線形に増加 16 線形リストによる実装が原因? 関連研究(1) アスペクト指向システム AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可 μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定 ポイントカット可能位置の増加でコードサイズが増加 17 従来の C/C++用アスペクト指向システム 動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定的 関数の先頭のみをポイントカットとして指定可能 コンパイル時に構造体、マクロの情報が消失 静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに 再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下 KLASではシンボル情報を拡張し、実行時に構造体、マクロをポイントカット可能 18 関連研究(2) カーネルプロファイラ LKST [畑崎 ’03] 決められたイベントの箇所でログ出力可能 KLASは関数呼び出し、構造体アクセスでログ出力可能 カーネルコード変換 KernInst [Ariel ’02] Solaris版はジャンプ, Linux版はBPTでフックを実現 カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 KLASはソースレベルの情報で指定可能 19 まとめ カーネル用アスペクト指向システムKLASの提案 FreeBSD 5.2.1、gcc 3.3.4を改造して実装 ソースコードを参照し、実行中のバイナリにフック埋め込み コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとしてBPTを使用 実験 カーネルコンパイル時間が約2倍となることがわかった フックの数に対して非線形に消費時間が増加することがわ かった 20 今後の課題 コンパイラ性能の改善 フックアドレス、アドバイスマップの改善 データ構造の変更による所要オーダーの軽減 フックをより正確な位置に挿入 バッファリングによるI/Oオーバーヘッドの軽減 現在は行単位でフックを挿入 アスペクト間の依存関係の取り扱いの実現 存在しないデータをアクセスする危険性の除去 21 22 23 カーネルプロファイラに必要な機能 実行時に時間測定箇所を変更可能 時間測定のコードを指定可能 多くのOSカーネルのコードはC言語で書かれる 測定の影響を最小化 ログを取得するため C言語に対応 プロファイリングが進むと測定範囲を縮小 測定誤差を最小化 時間測定箇所を細密に指定可能 測定の精度を高めたい 24 実装の概要 アスペクト (XML) KLAS アスペクトを コンパイル KLAS_gcc アスペクトローダ アドレスリゾルバ OSカーネル ソースコード シンボル 情報 シンボル情報抽出 フック挿入 コンパイル済み アスペクト コンパイル OSカーネル (FreeBSD) 25 KLAS_gccの実装 gcc 3.3.4を改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 ip_output(…) { struct mbuf *m0; … m0->m_pkthdr … } 1.ハッシュ表に 構造体名、IDを保存 ハッシュ表 2.IDをキーにして構造体名を取得 3.ファイル名、行番号、構造体名、メンバ名を出力 シンボル情報 /usr/…/ip_output.c:879:m0.m_pkthdr 26
© Copyright 2024 ExpyDoc