21
1 OS カカカカカカ カカカカカカカカカカカ カカ カカ * カカ カ* カカ カ * * カカカカカカ カカカカカカカカ カカ カカカカカカ

OS カーネル用の アスペクト指向システム

Embed Size (px)

DESCRIPTION

OS カーネル用の アスペクト指向システム. 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻. カーネルプロファイリング. 動機: ネットワーク性能の劣化を調査 ダウンロード中に SSH のレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在. カーネルプロファイラが必要. プロファイル. pr_slowtimeo. tcp_slowtimeo. m_copydata. pr_output. tcp_output. ether_output. - PowerPoint PPT Presentation

Citation preview

Page 1: OS カーネル用の アスペクト指向システム

1

OS カーネル用のアスペクト指向システム

柳澤 佳里 * 光来 健一 * 千葉 滋*

* 東京工業大学 情報理工学研究科 数理・計算科学専攻

Page 2: OS カーネル用の アスペクト指向システム

2

カーネルプロファイリング 動機: ネットワーク性能の劣化を調査

ダウンロード中に SSH のレスポンスが悪化 十分なネットワーク帯域があるのに発生

カーネル内にボトルネック? 疑わしい場所は無数に存在

writeip

_out

put

tcp_o

utpu

t

ether

_out

put

sose

ndpr

_out

put

if_output

pr_s

lowtim

eo

tcp_s

lowtim

eo

m_c

opyd

atam

_cop

y

tcp_u

srreq

sbap

pend

copy

in

socket TCP IP datalink

カーネルプロファイラが必

要プロファイル

Page 3: OS カーネル用の アスペクト指向システム

3

従来のカーネルプロファイリング技術

測定粒度が固定 関数単位 – μDyner [Marc ’03], TOSKANA [Michael ’05]

サポートされた種類のイベント – LKST [ 畑崎 ’ 03]

任意の粒度で測定 メモリ中のアドレスを直接指定 – KernInst [Ariel

’02] 構造体、ローカル変数、インライン関数、 static

関数、マクロなどのアドレスが実行時に消失

Page 4: OS カーネル用の アスペクト指向システム

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

Page 5: OS カーネル用の アスペクト指向システム

5

KLAS (Kernel Level Aspect-oriented System)

Source-based binary-level dynamic weaving カーネル用アスペクト指向システム

ソースレベルで挿入コードと位置を指定 アスペクトを XML として記述

動的にコード挿入 再コンパイル・再起動が不要

任意の処理を指定可能 コンパイラの改造によりシンボル情報を拡張

実行時に weaver がシンボル情報を利用可能に

Page 6: OS カーネル用の アスペクト指向システム

6

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; ….}

Page 7: OS カーネル用の アスペクト指向システム

7

KLAS の文法<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 へのアクセスをポイントカッ

トとして抽出

ポイントカット位置で時間を表示

Page 8: OS カーネル用の アスペクト指向システム

8

KLAS の文法<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>

m_len へのアクセスをポイントカッ

トとして抽出

tcp_output(…) { struct mbuf *m; struct timespec ts; ….. printf(…) m->m_len = hdrlen; …

挿入

Page 9: OS カーネル用の アスペクト指向システム

9

実装の概要

シンボル情報

アスペクト ( XML )- 測定点- 測定点で実行するコード

OS ソースコード

アドレスリゾルバ

コンパイル済アドバイス

フック挿入

OS カーネル

(FreeBSD)

KLAS

アドバイスローダ

KLAS_gcc

シンボル情報抽出

コンパイル

フック

Page 10: OS カーネル用の アスペクト指向システム

10

1. ハッシュ表に構造体名、 ID を保存

2. ID をキーにして構造体名を取得

3. ファイル名、行番号、構造体名、メンバ名を出力

KLAS_gcc の実装 gcc を改造 出力するシンボル情報を拡張

構造体メンバアクセスのファイル名、行を出力ip_output(…) {

struct mbuf *m0; … m0->m_pkthdr …}

/usr/…/ip_output.c:879:mbuf.m_pkthdr

シンボル情報

ハッシュ表1

3

KLAS_gcc

Page 11: OS カーネル用の アスペクト指向システム

11

アドレスリゾルバ:メンバアクセスとアドレスの対応

構造体名、メンバ名を渡すと対応するファイル名、行情報の一覧を得る 拡張シンボル情報を検索

ファイル名、行情報よりアドレスを得る バイナリに入っているデバッグ情報を調査

352041“ip_output.c”“GNU C Compiler”“frodo:/usr/src/sys/…”…

debug_info…/usr/…put.c:175:ip.ip_v/usr/…put.c:176:ip.ip_hl…/usr/…257:mbuf.m_flags

拡張シンボル情報

対応するファイル名、行 アドレス

構造体名メンバ名

Page 12: OS カーネル用の アスペクト指向システム

12

アドバイスローダ:アドバイスのカーネル内部へのロード

カーネルモジュール (KM) としてロード KM では重複しない任意の関数をロード、使用

可能

struct timespec ts;nanotime(&ts);printf(… ts.tv_nsec);

}DECLARE_MODULE(…ANY);

#include <sys/types.h>#include <sys/module.h>…static int log_mbuf_loader(…) {…}int log_mbuf(….) {

コンパイル済みアドバイス(カーネルモジュール)

OS カーネル

ヘッダ

アドバイス

フッタコ

ンパ

イル

ロード (kldload)

Page 13: OS カーネル用の アスペクト指向システム

13

フック挿入:カーネルへのフック埋め込み

ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しな

い 動作BPT

フック挿入

アドレスマップコンパイル済みアドバイス

2.アドレスマップに登録

3. BPT 挿入

1.アドバイスのアドレスを取得

Page 14: OS カーネル用の アスペクト指向システム

14

フック挿入:カーネルへのフック埋め込み

ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しな

い 動作 (フック作動時)BPT

フック挿入

アドレスマップコンパイル済みアドバイス

トラップ処理ルーチン

1.処理が遷移

2.対応アドバイスの確認

3.アドバイスを実行

Page 15: OS カーネル用の アスペクト指向システム

15

実験 I: カーネルコンパイル時間

実験内容 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%

Page 16: OS カーネル用の アスペクト指向システム

16

実験 II: フック数と実行時間 目的

フックの数と実行時間の変化を調査

実験内容 実験用システムコール

の実行時間を測定 システムコール内で千個の関数を順に呼び出し

各関数に挿入するフックは高々 1つ

フックにより実行するコード内容は空

実験結果実験環境 : FreeBSD 5.2.1

フック数

フックの処理に DDB を利用した実装が原因

DDB はフック処理時に全 BPT を消去、復帰

経過

時間

(s)

Page 17: OS カーネル用の アスペクト指向システム

17

関連研究 (1) アスペクト指向システム

AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可

μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定

ポイントカット可能位置の増加でコードサイズが増加 TOSKANA [Michael ’05]

NetBSD カーネルに実装されたアスペクト指向システム 関数の開始、終了位置にてフック埋め込みを実施

関数の粒度より細粒度のフック埋め込みは不可

Page 18: OS カーネル用の アスペクト指向システム

18

従来のC/C++ 用アスペクト指向システム

動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定

的 関数の先頭のみをポイントカットとして指定可能

コンパイル時に構造体、マクロの情報が消失

静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに

再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下

KLAS ではシンボル情報を拡張し、実行時に構造体をポイントカット可能

Page 19: OS カーネル用の アスペクト指向システム

19

関連研究 (2) カーネルプロファイラ

LKST [ 畑崎 ’ 03] 決められたイベントの箇所でログ出力可能 KLAS は関数呼び出し、構造体アクセスでログ出力可

能 カーネルコード変換

KernInst [Ariel ’02] カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 挿入するコードの指定が機械語に近く、煩雑 KLAS はソースレベルの情報で指定可能

Page 20: OS カーネル用の アスペクト指向システム

20

まとめ カーネル用アスペクト指向システム KLAS の提案

FreeBSD 、 gcc を改造して実装 ソースコードを参照し、実行中のバイナリにフック埋め込み

コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとして BPT を使用

実験 カーネルコンパイル時間が約 7%増加することがわかった フックの数に対して非線形に消費時間が増加することがわかった

Page 21: OS カーネル用の アスペクト指向システム

21

今後の課題 フックの処理時間の改善

実装の変更による所要オーダーの軽減 高速化のために Kerninst ベースの開発を検討

フック可能な処理を増加 インライン関数、マクロに対応

フックをより正確な位置に挿入 コンパイラの改良により行よりも細かい単位でフッ

ク挿入 最適化により消える命令の取り扱いを検討