柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

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

柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻 OSカーネル用の アスペクト指向システム 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻

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

従来の カーネルプロファイリング技術 測定粒度が固定 任意の粒度で測定 関数単位 – μDyner [Marc ’03], TOSKANA [Michael ’05] サポートされた種類のイベント – 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、ファイルキャッシュの統計情報 fo_read(…) { return ((*fp->f_ops->fo_read(…)); } tcp_input(…) { … m->m_len += hdrlen; m->m_data -= hdrlen; …. }

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

m_lenへのアクセスをポイントカットとして抽出 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(…); </advice-before> </aspect> tcp_output(…) { struct mbuf *m; struct timespec ts; ….. printf(…) m->m_len = hdrlen; … 挿入

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

/usr/…/ip_output.c:879:mbuf.m_pkthdr KLAS_gccの実装 gccを改造 出力するシンボル情報を拡張 構造体メンバアクセスのファイル名、行を出力 ハッシュ表 ip_output(…) { struct mbuf *m0; … m0->m_pkthdr } 1 2 KLAS_gcc ハッシュ表に構造体名、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 243.86 212.98 29.16 KLAS_gccのオーバーヘッドを測定 KLAS_gcc、gccのカーネルコンパイル時間を比較 実験環境 CPU: AMD Athlon 2200+, Mem: 1GB, HDD: UDMA133, gcc: 3.4.2 実験結果 総実行時間(秒) User System gcc 243.86 212.98 29.16 KLAS_gcc 260.43 218.44 40.13 約7%実行時間が増加 User: 約3%, System: 約38%

実験II: フック数と実行時間 目的 実験結果 実験内容 フックの数と実行時間の変化を調査 実験用システムコールの実行時間を測定 システムコール内で千個の関数を順に呼び出し 各関数に挿入するフックは高々1つ フックにより実行するコード内容は空 実験結果 実験環境: FreeBSD 5.2.1 経過時間(s) フック数 フックの処理にDDBを利用した実装が原因 DDBはフック処理時に全BPTを消去、復帰

関連研究(1) アスペクト指向システム AspectC++ [Olaf ’02] μDyner [Marc ’03] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可 μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定 ポイントカット可能位置の増加でコードサイズが増加 TOSKANA [Michael ’05] NetBSDカーネルに実装されたアスペクト指向システム 関数の開始、終了位置にてフック埋め込みを実施 関数の粒度より細粒度のフック埋め込みは不可

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

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

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

今後の課題 フックの処理時間の改善 フック可能な処理を増加 フックをより正確な位置に挿入 実装の変更による所要オーダーの軽減 高速化のためにKerninstベースの開発を検討 フック可能な処理を増加 インライン関数、マクロに対応 フックをより正確な位置に挿入 コンパイラの改良により行よりも細かい単位でフック挿入 最適化により消える命令の取り扱いを検討