Presentation is loading. Please wait.

Presentation is loading. Please wait.

柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻

Similar presentations


Presentation on theme: "柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻"— Presentation transcript:

1 柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻
動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use) 柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻

2 カーネルプロファイリング 動機: ネットワーク性能の劣化を調査 カーネルプロファイラが必要 カーネル内にボトルネック?
ダウンロード中にSSHのレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在 カーネルプロファイラが必要 プロファイル pr_slowtimeo tcp_slowtimeo pr_output sbappend tcp_usrreq tcp_output m_copydata ether_output copyin ip_output sosend m_copy write if_output socket TCP IP datalink

3 従来のカーネルプロファイリング技術 測定粒度が固定 任意の粒度で測定 関数単位 – μDyner [Marc ’03]
サポートされた種類のイベント – LKST [畑崎 ’03] 任意の粒度で測定 メモリ中のアドレスを直接指定 – KernInst [Ariel ’02] 構造体、ローカル変数、インライン関数、static関数、マクロなどのアドレスが実行時に消失

4 プロファイルできない例 構造体メンバへの代入を逐一プロファイル アドレス情報はバイナリに欠如 mbuf構造体 - ネットワークI/Oで多用
アドレスの直指定はユーザに重荷 測定したい処理のアドレスを特定できない tcp_output(…) { struct mbuf *m; m->m_len = hdrlen; } struct mbuf { struct m_hdr m_hdr; } #define m_len m_hdr.m_len アドレス情報はバイナリに欠如

5 KLAS (Kernel Level Aspect-oriented System)
Source-based binary-level dynamic weaving カーネル用アスペクト指向システム ソースレベルで挿入コードと位置を指定 アスペクトをXMLとして記述 動的にコード挿入 再コンパイル・再起動が不要 任意の処理を指定可能 コンパイラの改造によりシンボル情報を拡張 実行時にweaverがシンボル情報を利用可能に

6 KLASにより指定可能となる処理 関数ポインタ呼び出し データアクセス カーネル内のポリモルフィズム的コードで多用
E.g.) VFS、ファイル、ソケットなどの入出力 データアクセス まとまったデータのやり取りを行う箇所で多用 E.g.) mbuf、ファイルキャッシュの統計情報 tcp_input(…) { m->m_len += hdrlen; m->m_data -= hdrlen; …. } fo_read(…) { return ((*fp->f_ops->fo_read(…)); }

7 m_lenへのアクセスをポイントカットとして抽出
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> ポイントカット位置で時間を表示

8 m_lenへのアクセスをポイントカットとして抽出
KLASの文法 m_lenへのアクセスをポイントカットとして抽出 <aspect name=“log_reset_len”> <pointcut> <field name=“m_len” structure=“mbuf” /> </pointcut> <advice> struct timespec ts; nanotime(&ts); printf(…); </advice> </aspect> tcp_output(…) { struct mbuf *m; struct timespec ts; ….. printf(…) m->m_len = hdrlen; 挿入

9 実装の概要 KLAS OSカーネル (FreeBSD) アスペクト OSソースコード (XML) KLAS_gcc アドレス リゾルバ
シンボル 情報 シンボル情報抽出 アドバイス ローダ フック 挿入 コンパイル フック OSカーネル (FreeBSD) コンパイル済アドバイス

10 /usr/…/ip_output.c:879:mbuf.m_pkthdr
KLAS_gccの実装 gcc 3.3.4を改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 ハッシュ表 ip_output(…) { struct mbuf *m0; m0->m_pkthdr } 1 KLAS_gcc ハッシュ表に構造体名、IDを保存 IDをキーにして構造体名を取得 ファイル名、行番号、構造体名、メ ンバ名を出力 3 シンボル情報 /usr/…/ip_output.c:879:mbuf.m_pkthdr

11 アドレスリゾルバ: メンバアクセスとアドレスの対応
構造体名、メンバ名を渡すと対応するファイル名、行情報の一覧を得る 拡張シンボル情報を検索 ファイル名、行情報よりアドレスを得る バイナリに入っているデバッグ情報を調査 拡張シンボル情報 debug_info 35 2 4 1 “ip_output.c” “GNU C Compiler” “frodo:/usr/src/sys/…” /usr/…put.c:175:ip.ip_v /usr/…put.c:176:ip.ip_hl /usr/…257:mbuf.m_flags 構造体名 メンバ名 対応する ファイル名、行 アドレス

12 アドバイスローダ: アドバイスのカーネル内部へのロード
カーネルモジュール(KM)としてロード KMでは重複しない任意の関数をロード、使用可能 動作 コンパイル #include <sys/types.h> #include <sys/module.h> static int log_mbuf_loader(…) { } int log_mbuf(….) { ヘッダ コンパイル済みアドバイス (カーネルモジュール) ロード(kldload) struct timespec ts; nanotime(&ts); printf(… ts.tv_nsec); アドバイス OSカーネル フッタ } DECLARE_MODULE(…ANY);

13 フック挿入: カーネルへのフック埋め込み ブレークポイントトラップ(BPT)をフックに使用 動作
x86では1byte命令で実行フローを破壊しない 動作 3.BPT挿入 BPT フック挿入 アドレスマップ コンパイル済みアドバイス 2.アドレスマップに登録 1.アドバイスのアドレスを取得

14 フック挿入: カーネルへのフック埋め込み ブレークポイントトラップ(BPT)をフックに使用 動作 (フック作動時)
x86では1byte命令で実行フローを破壊しない 動作 (フック作動時) BPT 1.処理が遷移 フック挿入 トラップ処理ルーチン アドレスマップ 3.アドバイスを実行 2.対応アドバイス の確認 コンパイル済みアドバイス

15 実験I:カーネルコンパイル時間 実験内容 実験結果 総実行時間(秒) User System gcc 294.25 211.72 79.54
KLAS_gccのオーバーヘッドを測定 KLAS_gcc、gccのカーネルコンパイル時間を比較 実験環境 CPU: AMD Athlon 2200+, Mem: 1GB, HDD: UDMA133 実験結果 総実行時間(秒) User System gcc 294.25 211.72 79.54 KLAS_gcc 527.86 223.06 301.07 System時間が大きい I/Oオーバーヘッドが原因?

16 実験II: フック数と実行時間 目的 実験内容 実験結果 フックの数と実行時間の変化の調査 システムコールの実行時間を測定
システムコール内で千個の関数を順に呼び出し 各関数に挿入するアスペクトは高々1つ アドバイス内容は空 実験結果 非線形に増加 線形リストによる実装が原因?

17 関連研究(1) アスペクト指向システム AspectC++ [Olaf ’02] μDyner [Marc ’03]
ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可 μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定 ポイントカット可能位置の増加でコードサイズが増加

18 従来の C/C++用アスペクト指向システム
動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定的 関数の先頭のみをポイントカットとして指定可能 コンパイル時に構造体、マクロの情報が消失 静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに 再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下 KLASではシンボル情報を拡張し、実行時に構造体、マクロをポイントカット可能

19 関連研究(2) カーネルプロファイラ カーネルコード変換 LKST [畑崎 ’03] KernInst [Ariel ’02]
決められたイベントの箇所でログ出力可能 KLASは関数呼び出し、構造体アクセスでログ出力可能 カーネルコード変換 KernInst [Ariel ’02] Solaris版はジャンプ, Linux版はBPTでフックを実現 カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 KLASはソースレベルの情報で指定可能 要点を下にまとめる

20 まとめ カーネル用アスペクト指向システムKLASの提案 実験 FreeBSD 5.2.1、gcc 3.3.4を改造して実装
ソースコードを参照し、実行中のバイナリにフック埋め込み コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとしてBPTを使用 実験 カーネルコンパイル時間が約2倍となることがわかった フックの数に対して非線形に消費時間が増加することがわかった

21 今後の課題 コンパイラ性能の改善 フックアドレス、アドバイスマップの改善 フックをより正確な位置に挿入
バッファリングによるI/Oオーバーヘッドの軽減 フックアドレス、アドバイスマップの改善 データ構造の変更による所要オーダーの軽減 フックをより正確な位置に挿入 現在は行単位でフックを挿入 アスペクト間の依存関係の取り扱いの実現 存在しないデータをアクセスする危険性の除去

22

23

24 カーネルプロファイラに必要な機能 実行時に時間測定箇所を変更可能 時間測定のコードを指定可能 C言語に対応 測定の影響を最小化
プロファイリングが進むと測定範囲を縮小 時間測定のコードを指定可能 ログを取得するため C言語に対応 多くのOSカーネルのコードはC言語で書かれる 測定の影響を最小化 測定誤差を最小化 時間測定箇所を細密に指定可能 測定の精度を高めたい

25 実装の概要 KLAS KLAS_gcc OSカーネル (FreeBSD) OSカーネル ソースコード アスペクト (XML)
アスペクトを コンパイル KLAS KLAS_gcc アスペクトローダ シンボル 情報 アドレスリゾルバ コンパイル シンボル情報抽出 フック挿入 OSカーネル (FreeBSD) コンパイル済み アスペクト

26 /usr/…/ip_output.c:879:m0.m_pkthdr
KLAS_gccの実装 gcc 3.3.4を改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 1.ハッシュ表に 構造体名、IDを保存 ハッシュ表 ip_output(…) { struct mbuf *m0; m0->m_pkthdr } 2.IDをキーにして構造体名を取得 3.ファイル名、行番号、構造体名、メンバ名を出力 /usr/…/ip_output.c:879:m0.m_pkthdr シンボル情報


Download ppt "柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻"

Similar presentations


Ads by Google