Upload
philomena-desdemona
View
25
Download
0
Embed Size (px)
DESCRIPTION
OS カーネル用の アスペクト指向システム. 柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻. カーネルプロファイリング. 動機: ネットワーク性能の劣化を調査 ダウンロード中に SSH のレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在. カーネルプロファイラが必要. プロファイル. pr_slowtimeo. tcp_slowtimeo. m_copydata. pr_output. tcp_output. ether_output. - PowerPoint PPT Presentation
Citation preview
1
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
カーネルプロファイラが必
要プロファイル
3
従来のカーネルプロファイリング技術
測定粒度が固定 関数単位 – μDyner [Marc ’03], TOSKANA [Michael ’05]
サポートされた種類のイベント – 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 、ファイルキャッシュの統計情報
fo_read(…){ return ((*fp->f_ops->fo_read(…));}
tcp_input(…){ … m->m_len += hdrlen; m->m_data -= hdrlen; ….}
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 へのアクセスをポイントカッ
トとして抽出
ポイントカット位置で時間を表示
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; …
挿入
9
実装の概要
シンボル情報
アスペクト ( XML )- 測定点- 測定点で実行するコード
OS ソースコード
アドレスリゾルバ
コンパイル済アドバイス
フック挿入
OS カーネル
(FreeBSD)
KLAS
アドバイスローダ
KLAS_gcc
シンボル情報抽出
コンパイル
フック
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
2
3
KLAS_gcc
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
拡張シンボル情報
対応するファイル名、行 アドレス
構造体名メンバ名
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)
13
フック挿入:カーネルへのフック埋め込み
ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しな
い 動作BPT
フック挿入
アドレスマップコンパイル済みアドバイス
2.アドレスマップに登録
3. BPT 挿入
1.アドバイスのアドレスを取得
14
フック挿入:カーネルへのフック埋め込み
ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しな
い 動作 (フック作動時)BPT
フック挿入
アドレスマップコンパイル済みアドバイス
トラップ処理ルーチン
1.処理が遷移
2.対応アドバイスの確認
3.アドバイスを実行
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%
16
実験 II: フック数と実行時間 目的
フックの数と実行時間の変化を調査
実験内容 実験用システムコール
の実行時間を測定 システムコール内で千個の関数を順に呼び出し
各関数に挿入するフックは高々 1つ
フックにより実行するコード内容は空
実験結果実験環境 : FreeBSD 5.2.1
フック数
フックの処理に DDB を利用した実装が原因
DDB はフック処理時に全 BPT を消去、復帰
経過
時間
(s)
17
関連研究 (1) アスペクト指向システム
AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可
μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定
ポイントカット可能位置の増加でコードサイズが増加 TOSKANA [Michael ’05]
NetBSD カーネルに実装されたアスペクト指向システム 関数の開始、終了位置にてフック埋め込みを実施
関数の粒度より細粒度のフック埋め込みは不可
18
従来のC/C++ 用アスペクト指向システム
動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定
的 関数の先頭のみをポイントカットとして指定可能
コンパイル時に構造体、マクロの情報が消失
静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに
再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下
KLAS ではシンボル情報を拡張し、実行時に構造体をポイントカット可能
19
関連研究 (2) カーネルプロファイラ
LKST [ 畑崎 ’ 03] 決められたイベントの箇所でログ出力可能 KLAS は関数呼び出し、構造体アクセスでログ出力可
能 カーネルコード変換
KernInst [Ariel ’02] カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 挿入するコードの指定が機械語に近く、煩雑 KLAS はソースレベルの情報で指定可能
20
まとめ カーネル用アスペクト指向システム KLAS の提案
FreeBSD 、 gcc を改造して実装 ソースコードを参照し、実行中のバイナリにフック埋め込み
コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとして BPT を使用
実験 カーネルコンパイル時間が約 7%増加することがわかった フックの数に対して非線形に消費時間が増加することがわかった
21
今後の課題 フックの処理時間の改善
実装の変更による所要オーダーの軽減 高速化のために Kerninst ベースの開発を検討
フック可能な処理を増加 インライン関数、マクロに対応
フックをより正確な位置に挿入 コンパイラの改良により行よりも細かい単位でフッ
ク挿入 最適化により消える命令の取り扱いを検討