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

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Webプロキシサーバにおける 動的資源管理方式の提案と実装
ファイルキャッシュを考慮したディスク監視のオフロード
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
クラウドにおける ネストした仮想化を用いた 安全な帯域外リモート管理
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
IaaS 仮想マシン(VM)をネットワーク経由で提供 負荷に応じてVM数や性能を変更できる ハードウェアの導入・管理・維持コストの削減
Dynamic AOPと その実装手法について
通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー
柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻
App. A アセンブラ、リンカ、 SPIMシミュレータ
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
F11: Analysis III (このセッションは論文2本です)
AspectScope によるアスペクトとクラスのつながりの視覚化
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
CC/7700,CC32を用いた データ収集システム 筑波大学 木村 博美 小松原 哲郎 (c)2007 木村博美 筑波大学.
ネストした仮想化を用いた VMの安全な帯域外リモート管理
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
型付きアセンブリ言語を用いた安全なカーネル拡張
過負荷時の分散ソフトウェアの 性能劣化を改善する スケジューリングの提案
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
Xenによる ゲストOSの監視に基づく パケットフィルタリング
仮想計算機を用いて OSを介さずに行う安全な ファイルアクセス制御
暗黙的に型付けされる構造体の Java言語への導入
他のプロセスに あたえる影響が少ない 実行時ミラーリングシステム
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
実行時情報に基づく OSカーネルのコンフィグ最小化
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
通信機構合わせた最適化をおこなう並列化ンパイラ
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
東京工業大学 情報理工学研究科 数理・計算科学専攻 千葉研究室 栗田 亮
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
OSカーネル用 アスペクト指向システム KLASY
XenLASY: XenのI/O処理を 追跡するための アスペクト指向プロファイラ
カーネル用アスペクト指向システム KLAS
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
バイトコードを単位とするJavaスライスシステムの試作
ウェブアプリケーションサーバの Degradation Schemeの 制御に向けて
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
Josh : バイトコードレベルでのJava用 Aspect Weaver
実装について 前田俊行.
同期処理のモジュール化を 可能にする アスペクト指向言語
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
開発者との対話を活かした 横断的構造の表現
強制パススルー機構を用いた VMの安全な帯域外リモート管理
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
強制パススルー機構を用いた VMの安全な帯域外リモート管理
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

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

カーネルプロファイリング 動機: ネットワーク性能の劣化を調査 カーネルプロファイラが必要 カーネル内にボトルネック? ダウンロード中に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

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

プロファイルできない例 構造体メンバへの代入を逐一プロファイル アドレス情報はバイナリに欠如 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 アドレス情報はバイナリに欠如

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

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(…)); }

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> ポイントカット位置で時間を表示

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; … 挿入

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

/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 2 ハッシュ表に構造体名、IDを保存 IDをキーにして構造体名を取得 ファイル名、行番号、構造体名、メ ンバ名を出力 3 シンボル情報 /usr/…/ip_output.c:879:mbuf.m_pkthdr

アドレスリゾルバ: メンバアクセスとアドレスの対応 構造体名、メンバ名を渡すと対応するファイル名、行情報の一覧を得る 拡張シンボル情報を検索 ファイル名、行情報よりアドレスを得る バイナリに入っているデバッグ情報を調査 拡張シンボル情報 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 構造体名 メンバ名 対応する ファイル名、行 アドレス

アドバイスローダ: アドバイスのカーネル内部へのロード カーネルモジュール(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);

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

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

実験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オーバーヘッドが原因?

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

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

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

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

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

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

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

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

/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 シンボル情報