動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (a dynamic...
DESCRIPTION
動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use). 柳澤 佳里 (学籍番号 : 03M37311 ) 指導教官 : 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻. カーネルプロファイリング. 動機: ネットワーク性能の劣化を調査 ダウンロード中に SSH のレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在. カーネルプロファイラが必要. プロファイル. - PowerPoint PPT PresentationTRANSCRIPT
1
動的アスペクト指向に基づいた使いやすいカーネルプロファイラ(A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)
柳澤 佳里 (学籍番号 : 03M37311 )指導教官 : 千葉 滋
東京工業大学 情報理工学研究科 数理・計算科学専攻
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] サポートされた種類のイベント – 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 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 へのアクセスをポイントカッ
トとして抽出
ポイントカット位置で時間を表示
8
KLAS の文法<aspect name=“log_reset_len”> <pointcut> <field name=“m_len” structure=“mbuf” /> </pointcut> <advice> struct timespec ts; nanotime(&ts); printf(…); </advice></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 3.3.4 を改造 出力するシンボル情報を拡張
構造体メンバアクセスのファイル名、行を出力
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
実験結果総実行時間
(秒)User System
gcc 294.25 211.72 79.54
KLAS_gcc 527.86 223.06 301.07System 時間が大きいI/Oオーバーヘッドが原因 ?
16
実験 II: フック数と実行時間 目的
フックの数と実行時間の変化の調査
実験内容 システムコールの実行
時間を測定 システムコール内で千個の関数を順に呼び出し
各関数に挿入するアスペクトは高々 1つ
アドバイス内容は空
実験結果
非線形に増加線形リストによる実装が原因
?
17
関連研究 (1) アスペクト指向システム
AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可
μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定
ポイントカット可能位置の増加でコードサイズが増加
18
従来のC/C++ 用アスペクト指向システム
動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定的
関数の先頭のみをポイントカットとして指定可能 コンパイル時に構造体、マクロの情報が消失
静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに
再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下
KLAS ではシンボル情報を拡張し、実行時に構造体、マクロをポイントカット可能
19
関連研究 (2) カーネルプロファイラ
LKST [ 畑崎 ’ 03] 決められたイベントの箇所でログ出力可能 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言語に対応 多くの OS カーネルのコードは C言語で書かれる
測定の影響を最小化 測定誤差を最小化
時間測定箇所を細密に指定可能 測定の精度を高めたい
25
OS カーネル
(FreeBSD)
実装の概要アスペクト( XML )
KLASアスペクトローダ
アドレスリゾルバ
フック挿入
シンボル情報
OS カーネルソースコード
KLAS_gcc
シンボル情報抽出コンパイル
アスペクトをコンパイル
コンパイル済みアスペクト
26
KLAS_gcc の実装 gcc 3.3.4 を改造 出力するシンボル情報を拡張
構造体メンバアクセスのファイル名、行を出力
ip_output(…) { struct mbuf *m0; … m0->m_pkthdr …}
ハッシュ表
1. ハッシュ表に構造体名、 ID を保存
3. ファイル名、行番号、構造体名、メンバ名を出力
2.ID をキーにして構造体名を取得
/usr/…/ip_output.c:879:m0.m_pkthdr
シンボル情報