A Dynamic Aspect-oriented
System for Data-driven Profiling
of OS Kernels
柳澤 佳里
指導教員 千葉 滋
1
OSの性能向上は今でも重要な
課題
性能向上のため、2000年以降でも
スケジューラーの実装を変更
e.g. ULEおよびSMP (FreeBSD), O(1)およびCFS (Linux)
システムコールの実装を変更
e.g. NetBSD、FreeBSDでシステムコールの性能が向上
See Also: http://bulk.fefe.de/scalability/ (syscall ベンチマーク)
スレッド実装を変更
e.g. KSE (FreeBSD)、NPTL (Linux)
・・・などなど
2
カーネルプロファイラの必要性
OSの性能向上にはボトルネックの特定が不可欠
ボトルネックを発見して除去
再コンパイル、再起動なしの調査が必要
ソースコードを書き換える単純な方法では、
現象の再現まで長時間待つ必要がある
開発者がミスしがち
仮想化により、問題点の発見がさらに困難に
関連する部分が増加
3
カーネルプロファイラの要件
自由度
任意の調査点で任意の調査コードが実行できる
調査に応じて調査対象が変化
最初はおおざっぱに調査し、徐々に絞り込む
調査データに基づきログ出力の内容を変更する
抽象度
調査点、調査コードの選択をソースコードレベルの視点で可能
調査の効率を向上
調査点を選びやすいと調査がしやすい
抽象度の高い言語で調査コードがかけると調査がしやすい
4
理想のプロファイリング
Linux カーネルソースコード (fs/attr.c)
int inode_change_ok(…)
{
…
if ((ia_valid & ATTR_UID) && …
attr->ia_uid != inode->i_uid) …
goto error;
挿入
if ((ia_valid & ATTR_GID) &&
…
}
ソースコード中の関連箇所を
自動的に選び出し、変数の値
とタイムスタンプを記録
再コンパイル、再起動
無しでプロファイリングしたい
プロファイリングコード
struct timeval tv;
do_gettimeofday(&tv) ;
print_tv(tv);
printk(“%ld”, inode->i_uid);
5
従来のカーネルプロファイラ (1)
イベントドリブン方式
指定したイベントの発生時にログ取得コードを実行
任意のログ取得コードを記述できるものが存在
調査点の指定は適度に抽象化
作者により決められた調査点でのみ調査
調査しない場合でもオーバーヘッドが発生
例) SystemTAP [Vara ’05]、DTrace [Bryan ’04]
独自言語を用意し、高い抽象度でのプロファイリングコードの
記述が可能
プロファイリング箇所は関数などに決め打ち
6
従来のカーネルプロファイラ (2)
動的コード挿入方式
指定されたコードを指定された箇所に動的に挿入
アドレス指定で任意の箇所にコード挿入可能
コード挿入箇所の指定方法の抽象度が低い
例) Kerninst [Ariel ’99], GILK [David ’02]
Linuxカーネルの任意の箇所に動的にコード挿入可能
アセンブリレベルの抽象度
任意の箇所を指定する際は抽象度が非常に低い
7
Kerninstでの記述例
開発者は次のアドレスの調査が必要:
コードを挿入する機械語のアドレス
記録する変数が格納された場所のアドレス
面倒くさい
サンプルコード: Kerninst を用いてログを取得
kmgr.createInstPointAtAddr(inst_ptr, &insert_point);
kmgr.findModule(“profiler”, &kmod);
kmod.findFunction(“print_log”, &pf);
void print_log() {
hook = kapi_call_expr(pf.getEntryAddr(), args);
…
Kmgr.insertSnippet(hook,insert_point);
__asm__ (“movl %%ebp, %0” : “=r”(ebp));
uid = ((struct inode*)ebp[11])->i_uid;
/* ebp[11] is inode */
…
8
従来手法のまとめ
従来のカーネルプロファイラは要件を満たさない
自由度と抽象度を両立しない
ソースコードレベルの抽象度で任意のコードを書けるシ
ステムが必要
自由度
抽象度
イベントドリブン
×
○
動的コード挿入
○
×
9
動的アスペクト指向を用いた
プロファイリングの提案
プログラム中の主要な実行点を調査点として選択可能
ソースコードレベルの抽象度を提供
選択可能な点: 関数呼び出し、実行、変数の参照など
高級言語で調査コードを記述可能
調査点の選択がソースコードレベルの視点で可能
調査範囲、対象の変更が実行時に可能
必要なときに調査が可能
広いところから絞り込める
無停止なので情報が消失しない
コード挿入後に再現するまで待つ必要がない
10
アスペクト指向 (AOP) とは?
ポイントカット
調査点(ジョインポイント)を
指定
関数呼び出し
変数アクセスの指定
call/execution
set/get
アドバイス
ポイントカットで指定した実
行点で実行するコード
ジョインポイントの例
n_time
Iptime()
関数実行箇所
{
…
関数呼び出し
getmicrotime(&atv);
t=…
return (htonl(t));
}
変数への参照、代入
11
動的アスペクト指向 (DAOP)
動作中のカーネルに動的にアスペクトを織り込み
無停止に調査コード (アスペクト) を挿入
AOPを使うことで抽象度を確保
実装方法
動的コード書き換え or フックの挿入
e.g. PROSE [Andrei ’02]、Wool [Yoshiki ’03]
仮想マシンの改造
e.g. Steamloom [Christoph ’04]
12
本研究の貢献
カーネルプロファイリング用途でDAOPを使うこと
を提案
(前述)
プロファイリングのためのC言語用DAOPシステム
を開発 (後述)
データを扱うためのポイントカットを提供
構造体メンバーアクセス、データフローへのポイントカット
構造体メンバーのポイントカット: 実装方法を提案
データフローのポイントカット: 新たなポイントカット記述子を提案
13
従来のDAOPは不十分
C言語用DAOPでJava用DAOP並のポイントカット
があればいいのに!
Java用のDAOPはカーネルに使えない
ポイントカットの種類が豊富
多くのOSはC言語で記述
従来のC言語用DAOPは不十分
データのまとまりを扱うポイントカットが不十分
OSカーネルの特性に対応できていない
14
OSカーネルの特性
高度なモジュール化
共通のデータ構造として構造体を複数モジュールで共用
ポリモルフィズム風機構を構造体で実装
データのやりとりに構造体を多用
厳しいコーディング規約で使用する構造体に規則が存在
複数スレッドでデータ処理
コールフローでのプロファイリングが不可
きちんとしたレイヤー分け
e.g.
即応性が求められるデバイスドライバ (bottom half)
高度な処理をする上位レイヤー (top half)
15
データを扱うポイントカットの
プロファイリングにおける必要性
カーネルの特性をうまく利用
構造体メンバーアクセスは大規模Cプログラムで使用
関数間でのデータの受け渡しに利用
ポリモルフィズムの実現に利用
効率的
データを使っているモジュールを一発で選択
cf. 関数を列挙する方法では、
調査するサブシステムについての詳細な知識が必要
過不足なく関数を選択するため
関数のシンボルを残すために最適化禁止が必須
Inline関数への対応が必要
現実のOSカーネルは最適化オプションありでコンパイル
16
従来のC言語用DAOP
データを扱うポイントカットが不足
TOSKANA [Michael ’05]、TinyC2 [Charles ’03]、
DAC++ [Sufyan ’05]
Arachne [Remi ’05]
関数実行を選択するポイントカットのみ
関数呼び出し、返値、グローバル変数を選択するポイントカットのみ
μDyner [Marc ’03]
ジョインポイントとなる関数をアノテーションで指定
同様の方法でジョインポイントが増えるが、イベントドリブン方式のプロ
ファイラーと同じ問題を内包
17
本研究で開発したDAOPの機構
データ利用箇所を選択するポイントカットを提案
(1) accessポイントカット [GPCE ’06](点を指定)
構造体メンバーへのアクセスをポイントカット
OSの特性として、構造体を関連モジュールで共用
データフローを選択するポイントカットを提案
(2) xflowポイントカット [PRO ’07](点から線に)
特定のデータを持つ構造体インスタンスをポイントカット
マルチスレッド環境で処理フローの追跡が可能
18
(1) Access pointcut and KLASY
19
KLASY:
Kernel Level Aspect-oriented SYstem
Access pointcut
構造体メンバーへのアクセスをポイントカット
OSカーネルの関連箇所をまたいで選択
Source-based binary-level dynamic weaving
コンパイル時に得られる豊富な情報を実行時に利用
コンパイラを拡張し、出力するシンボル情報を拡張
シンボル情報を用いて構造体メンバーへのアクセス、ローカ
ル変数などの情報を取得
Kerninstを用いてアドバイスコードを挿入
20
KLASYのアスペクト
アスペクト
Linux カーネルコード (fs/attr.c)
<aspect>
int inode_change_ok(…)
<import>linux/time.h</import>
{
…
pointcut
<advice><pointcut>
if ((ia_valid & ATTR_UID) && …
access(inode.i_uid) AND
attr->ia_uid != inode->i_uid) …
within_function(inode_change_ok)
goto error;
選択
AND target(inode_value)
</pointcut>
if ((ia_valid & ATTR_GID) &&
advice
<before>
…
struct inode *i = inode_value;
}
struct timeval tv;
do_gettimeofday(&tv);
print(i->i_uid, tv.tv_sec, tv.tv_usec);
</before>
</advice>
</aspect>
21
KLASYの対応する
主なポイントカット、アドバイス
ポイントカット
access
execution
本研究で提案
構造体メンバーアクセスを選択
関数実行を選択
アドバイス
before
選択された点の前でプロファイリングコードを実行
after
選択された点の後でプロファイリングコードを実行
22
実行時コンテキストの取得に使う
ポイントカット
ポイントカット記述子
target
local_var
accessポイントカットで選択したメンバーを持つ構造体変数への
参照を取得
accessポイントカットで選択した箇所でローカル変数への参照を
取得
argument
executionポイントカットで選択した関数の引数への
参照を取得
23
KLASYの実装
Source-based binary-level dynamic weaving
GNU C コンパイラ(gcc)を拡張
生成した拡張シンボル情報を用い:
Kerninstをバックエンドに利用
構造体メンバーへのアクセスをポイントカット可能
実行時コンテキスト(変数のアドレス)を取得可能
動的織り込みを実現
C言語でアドバイスを記述
ソースレベルの視点で記述可能
XML風のタグで囲まれている
24
処理の流れ
OS
ソースコード
アスペクト
アスペクトコンパイラー
拡張シンボル情
報
KLASY
gcc
ポイントカット
insmod
OSカーネル
コンパイル済み
アドバイス
ウィーバー
OS カーネル
フック
本体
25
処理の流れ
OS
ソースコード
アスペクト
アスペクトコンパイラー
拡張シンボル情
報
KLASY
gcc
ポイントカット
insmod
OSカーネル
コンパイル済み
アドバイス
ウィーバー
OS カーネル
フック
本体
26
KLASY gcc
KLASY gccは次のシンボル情報を収集:
構造体メンバーアクセスのあるファイル名、行番号
コンパイラーのパーザーを拡張
従来のgccではこの情報は消失
各行の先頭命令のあるアドレス
コンパイル時にデバッグオプション(-g)を利用
構造体メンバーアクセスのポイントカットにこれも必要
27
処理の流れ
OS
ソースコード
アスペクト
アスペクトコンパイラー
拡張シンボル情
報
KLASY
gcc
ポイントカット
insmod
OSカーネル
コンパイル済み
アドバイス
ウィーバー
OS カーネル
フック
本体
28
ウィーバー
Kerninstを用いポイントカットで選択した点に
フック挿入
フック
アドバイスボディを呼び出すためのコード
フック挿入アドレスの取得方法
構造体メンバーアクセス
ファイル名、行番号
行の先頭アドレス
拡張シンボル情
報を利用
29
アンウィーブ
KLASYでは実行時にOSカーネルから織り込んだ
アスペクトを削除可能
プロファイリングには重要な機能
一般に利用者は様々なアスペクトを試用
観察効果を避けるため不要なアスペクトの削除は必要
利用者はわかりやすい名前でアスペクトを指定可能
Kerninstを用いてウィーバーの入れたフックを消去
30
アスペクト例における
実行時コンテキストの取得
アスペクト
Linux カーネルソースコード (fs/attr.c)
<aspect>
int inode_change_ok(…)
<import>linux/time.h</import>
{
<advice><pointcut> ポイントカット …
if ((ia_valid & ATTR_UID) && …
access(inode.i_uid) AND
attr->ia_uid != inode->i_uid) …
within_function(inode_change_ok)
goto error;
AND target(inode_value)
selected
</pointcut>
if ((ia_valid
& ATTR_GID) &&
ローカル変数を取得し、
アドバイス
<before>
…
アドバイス内で利用
struct inode *i = inode_value;
}
struct timeval tv;
do_gettimeofday(&tv);
print(i->i_uid, tv.tv_sec, tv.tv_usec);
</before>
</advice>
</aspect>
31
実行時コンテキストの取得の実装
ウィーバーとKLASY gccの連携により実現
KLASY gccにて構造体への参照方法を保存
ローカル変数から目的の構造体への参照に至る方法を保存
例)
inode.length
→
&inode
inode_ptr->length →
inode_ptr
ウィーバーにて参照を得るトランポリンコードを作成
ローカル変数の格納場所をデバッグ情報をから取得
Gccの作成したデバッグ情報を利用
保存された方法で構造体への参照を得、アドバイスに渡す
32
実験
UnixBenchによるベンチマーク
Linux: 通常gccでコンパイルしたカーネル
-fomit-frame-pointerオプションあり
KLASY: KLASY gccでコンパイルしたカーネル
実行時コンテキスト取得のため、-fomit-frame-pointerオプション
使用不可
デバッグ情報の示す変数位置と実位置がずれるため
ほぼ-fomit-frame-pointer禁止によるオーバーヘッドを測定
実験環境
CPU: AthlonXP™ 1800+, Mem: 1GB, Linux 2.6.10
Kerninst 2.1.1, gcc 3.3.3, Intel Ethernet PRO/1000
33
実験結果
現実的なオーバーヘッドであることを確認
1000
800
600
400
200
Linux
ex
ec
co l
nt
ex
t
pi
pe
sy
sc
all
0
y2
re
g
dhry2reg: drystone
syscall: システムコール
pipe: pipeシステムコール
execl: execlシステムコール
context: コンテキストスイッチ
dh
r
KLASY
34
ケーススタディ:
ネットワークI/Oサブシステムの調査
目的
過負荷におけるLinuxネットワークサブシステムの
性能ボトルネックを発見
Sk_buff構造体へのアクセスをトレース
Sk_buff構造体はLinuxにてネットワークサブシステムでバッ
ファとして利用
Sk_buffのトレースによりネットワークサブシステムの挙動を把握
KLASYの実行時コンテキスト取得機能を利用
個々のパケットを識別するため
無関係なパケットを無視するため
35
調査に用いたアスペクト
ワイルドカード
<aspect><advice>
<pointcut>
access(sk_buff.%) AND target(arg0)
</pointcut>
<before>
struct sk_buff *skb = arg0;
skb->protocol
unsigned long timestamp;
if (skb->protocol != ETH_P_ARP) {
STORE_DATA($pc$);
プログラムカウンタ、
STORE_DATA(skb); ARPパケットを無視
sk_buff出現位置、
DO_RDTSC(timestamp);
タイムスタンプを保存
STORE_DATA(timestamp);
}
</before>
</advice></aspect>
36
トレース結果
プロセススケジューリングがボトルネックと判明
Skb_copy_datagram_iovec関数はプロセスの発行
したシステムコールから呼び出されるので
pa
cke
pa
cke
0.1
Time scale of packet arrival
差が大きい
t2
t1
1
10
Elapsed time
ip_rcv
netif_receive_skb
tcp_v4_rcv
1000_clean_rx_irq
ip_rcv_finish
100
1000
__kfree_skb
skb_copy_datagram_iovec
tcp_rcv_established
tcp_v4_do_rcv
37
ケーススタディでの
accessポイントカットの有用性
Sk_buff構造体の全メンバーをaccessポイントカット
Linuxネットワークサブシステムの挙動を把握
もし、executionポイントカットでやるとしたら…
ネットワークサブシステムについての詳細な知識が必要
過不足なく関数を選択するため
本ケーススタディでは76箇所(関数21個)にてログ取得
最適化禁止が必須
Inline関数への対応が必要
現実と大幅に異なる
OSカーネルは通常最適化オプションつきでコンパイルされる
例) Linux カーネルは-Os最適化オプションでコンパイル
本ケーススタディではstatic inline関数6箇所にてログ取得
38
第1部のまとめ
accessポイントカット
Source-based binary-level dynamic weaving
構造体メンバーへのアクセスをポイントカットで選択可能
実行時コンテキストを取得可能
ネットワークI/Oサブシステムのプロファイリングに
accessポイントカットが有用であると確認
性能ボトルネックがプロセススケジューリングにあると判明
39
(2) Xflow pointcut and XenLASY
XenLASY = KLASY + xflow + VM対応
40
I/Oフローの追跡が大切
I/Oフローとは
I/Oを発行してデバイスが送出する流れ
デバイスで受信しアプリケーションが受け取る流れ
個別のデータの動き (フロー) の追跡が必要
データがドメインUやドメイン0でどう処理されるかを知りたい
複数のドメインがI/Oした場合に、区別して追跡したい
余計なフローは取りたくない
個々のフローはフロー識別子 (ID) が必要
一つ一つのデータの流れを区別するため
41
単純なフロー追跡では不十分
コールフロー
関数呼び出しの流れを追跡
実行スレッドが変わると追跡不可
ドメイン間の追跡が不可能
トップハーフ / ボトムハーフの追跡が不可能
単純なデータフロー
データのポインタを追跡
データ形式が変化すると追跡不可
ドメイン間ではデータ形式が変化し、追跡不可
データの複製、分割すると追跡不可
42
VMでは特にI/Oフローが重要
データ処理に複数のOSが関与
I/Oがドメイン0を通る
複数のVMのI/Oが競合
例) XenのI/O処理 ドメイン0
ドメインU
OS
実ドライバ
OS
仮想ドライバ
仮想ドライバ
仮想マシンモニタ (VMM)
ハードウェア
43
XenLASY
Xen上のI/O処理をプロファイリングをするための
アスペクト指向システム
xflowポイントカット
Xen上のデータフローを選択するポイントカット
指定した種類のフローに指定したデータが入っている時を選択
文法: xflow(フロー名, データへのポインタ, フローID)
なお、フローIDは省略可
追跡すべきデータの流れをきめ細かく指定可能
開始点、中継点、終了点を指定
データ形式の変化、分割などにも対処
余計なデータが含まれないようにできる
44
KLASYを拡張
KLASY
カーネル用動的アスペクト指向システム
ソースコードレベルの情報を実行時の織り込みで利用
を拡張して開発
KLASYとは、
[Yanagisawa ’06]
accessポイントカットを実現
構造体メンバーへのアクセスをポイントカット
Source-based binary-level dynamic weaving
Xenに対応
xflowを扱えるよう言語拡張
@ドメイン名を使えるよう言語拡張
45
XenLASYのアスペクト例
accessポイントカットで選択
アスペクト
<aspect>
id1
データフロー (xflow)
<import>linux/time.h</import>
id2
<advice><pointcut>
DomainU
Domain0
access(sk_buff.%) AND target(skb) AND
xflow(netflow, skb, id)
</pointcut>
<before>
long long tsc;
sk_buff構造体インスタンスが
DO_RDTSC(tsc);
netflowのデータだった場合に
pc、時間、フローidをログ出力
STORE_DATA3($pc$, tsc, id);
</before>
netflow: ネットワークI/Oの
</advice>
フロー
</aspect>
46
xflowポイントカットの定義
<xflow name=“netflow”>
<start><pointcut>
access(sk_buff.data) AND
within_function(alloc_skb_from_cache)
</pointcut></start>
<transit><pointcut>
access(sk_buff.head) AND
within_function(skb_clone)
</pointcut>
<move from=“skb” to=“n” />
</transit>
netflow
start: 開始点
</xflow>
データフローの開始点を指定
transit: 中継点
データ形式が変わる場合
<quit><pointcut>
access(sk_buff.%) AND
within_function(__kfree_skb)
</pointcut></quit>
Xen上のネットワークI/O処理フ
ロー
skb_cloneは複製を作成
ドメイン間の場合
quit: 終了点
47
start/quit (開始点/終了点)
<start><pointcut>
access(sk_buff.data) AND
within_function(alloc_skb_from_cache)
</pointcut></start>
例
<start><pointcut>…</pointcut>
<select local_var=“data” />
</start>
構造体インスタンスからIDを
引けるよう登録、削除
構造体インスタンスの指定
<start><pointcut>…</pointcut>
<action>
int id = new_flowid();
…
</action>
</start>
省略時はaccessポイントカットで
選択した構造体のインスタンス
を選択
selectで任意の変数も指定可
DB登録/削除処理は自動で設
定
任意のコードを指定する場合は
actionを利用
48
transit (中継点)
<transit><pointcut>
access(sk_buff.head) AND
within_function(skb_clone)
</pointcut>
<move from=“skb” to=“n” />
</transit>
moveで対応付けを指示
例
<transit><pointcut>
…
</pointcut>
<copy from=“skb” to=“n” />
</transit>
skb: フローID格納元
n: フローID格納先
skbを鍵としてフローIDが
引けないようエントリを抹
消
エントリを保持するcopyも
用意
49
ドメインをまたがるtransit定義
xin_move、xout_move要素を用意
ドメインをまたがるとデータのアドレスからフローID
を引けない
ドメイン間ではアドレス空間が違う
ドメイン間ではデータベースを共有していない
フローIDを送信先ドメインに伝搬
ドメイン間で渡されるヘッダの空き領域にIDを格納
ヘッダ
ドメイン0
DomU
実データ
フローIDを格納
50
ドメイン間transitの例
<transit><pointcut>
access(netif_tx_request.flags) AND
within_file(drivers/../netfront.c@linU)
</pointcut>
<xin_move name=“netin” from=“skb” to=“tx”>
<field name=“flags” offset=“4” size=“12” />
</xin_move>
</transit>
linUからlin0にフローIDを
伝搬
xin_move
skbのフローIDをtxに格納
<transit><pointcut>
access(netif_tx_request.flags) AND
within_file(drivers/../netback.c@lin0)
</pointcut>
<xout_move name=“netin” from=”tx” to=“skb” />
</transit>
flagsメンバーの下位4ビット
目から12ビットを使用
xout_move
xin_moveの逆処理でフロー
IDを取得し、skbに割当
対象xin_moveはnameで選
択
@ドメイン名で選択するドメ
インを指定
tx->flags
12bit
4bit
51
xflowの実装: start/quitの変換
<start><pointcut>
access(sk_buff.data) AND
within_function(alloc_skb_from_cache)
</pointcut></start>
<pointcut>
access(sk_buff.data) AND target(skb)
AND within_function(alloc_skb_from_cache)
</pointcut>
<before>
id = get_new_flowid();
register_flowid(netflow, id, skb);
</before>
targetポイントカットを追加
構造体インスタンスへの参照を取得
DBに参照を鍵としてIDを
取り出せるよう登録
•alloc_skb_from_cache
でskbから新規フローID
を引けるようDBに登録
quitも同様
52
xflowの実装: transitの変換
<pointcut>
access(sk_buff.head)
AND within_function(skb_clone)
AND local_var(skb, skbp)
AND local_var(n, np)
</pointcut>
<before>
void *skb = *((void **)skbp);
void *n = *((void **)np);
int id = get_flowid(netflow, skb);
if (id != 0) {
register_flowid(netflow, id, n);
remove_flowid(netflow, skb);}
</before>
<transit><pointcut>
access(sk_buff.head) AND
within_function(skb_clone)
</pointcut>
<move from=“skb” to=“n” />
</transit>
•local_varポイントカットでロー
カル変数への参照取得
skbに割り当てら
れていたフローID •skb_cloneにてskbに割り当てら
をnに割り当てる れていたフローIDをnに割り当て
53
xflowの実装:
ドメイン間transitの変換
<transit><pointcut>
access(netif_tx_request.flags) AND
within_file(drivers/../netfront.c@linU)
</pointcut>
<xin_move name=“netin” from=“skb” to=“tx” />
<field name=“flags” offset=“4” size=“12” />
</xin_move>
</transit>
<pointcut>
access(netif_tx_request.flags) AND
within_file(drivers/.../netfront.c@linU)
AND local_var(tx, txp)
AND local_var(skb, skbp)
</pointcut>
<after>
struct netif_tx_request *tx = txp;
void *skb = *((void **)skbp);
id = get_flowid(skb);
ポインタに対応づ
if (id != 0) {
けられたフローID
tx->flags |= id << 4; をヘッダに格納
id >> 12;
}
remove_flowid(netflow, skb);
</after>
local_varポイントカットでロー
カル変数への参照取得
•XenのネットワークI/OはドメインU
でnetif_tx_request構造体にヘッダ
を格納
送信先でフローIDを
受け取るコードは割愛
54
実装: KerninstのXen対応
アスペクトの織り込みにKerninst [Tamches ’99]を使用
割り込みテーブル読み込みを除去
ブレークポイントトラップ処理関数をエクスポートし、Kerninstか
ら直接参照
割り込みテーブル読み込みは特権命令
ドメインUやドメイン0から読み込めない
特権レベル判定を変更
Xen上ドメインでの実行に対応
Kerninstはring0でカーネルが動作していると仮定
55
マイクロベンチマーク
目的
xflowのバックエンド関数の
オーバーヘッドを調査
実験方法
各関数を2000回呼び出し、平均
を計算
実験環境
CPU: AMD Athlon™ 64 3500+
メモリー: 2GB
ドメイン0: 256MB
ドメインU: 128MB
結果
関数名
実行時間(ナノ秒)
get_new_flowid
3 ± 0.0
空要素
get_flowid
9 ± 0.0
register_flowid
33 ± 4.0
get_flowid
15 ± 1.0
remove_flowid
32 ± 2.0
ドメイン0で実施
バックエンド関数のオーバーヘッドは低い
56
ネットワークI/Oのボトルネック
目的
ドメインUからドメイン0までの処理の流れ、ボトルネックを
調査
xflowを用いて、ドメインUからドメイン0までのデータ
フローを調査
sk_buff構造体のメンバーにアクセスがあった箇所でフ
ローIDを取得し、時間とともに記録
例に出したアスペクトを使用
57
実験結果
処理の流れがわかった
skb_clone関数でできた複製も追跡可能
TCP再送処理のためにTCP層で実行され、ドライバーは複製を利用
ボトルネックはドメイン0の内部
ボトムハーフ → トップハーフのところ
netif_receive_skbはトップハーフの処理割り当て関数
送信時のパケットの流れ
フロ
ー
0
500
1000
network_start_xmit
tcp_sendmsg
alloc_skb_from_cache
1500
2000
2500
経過時間 (μ秒)
netif_rx
netbk_fill_flags
3000
FreeTxDescriptors
3500
4000
__br_forward
netif_receive_skb SkGeXmit
58
xflowによるオーバーヘッドの削減
目的
方法
xflowを使うことでプロファイルのオーバーヘッドを削減できるか
調査
上のケーススタディのアスペクトでxflowありとなしを比較
ApacheBenchを300リクエスト、10並列で実行
メモリー使用量
結果
ドメイン0
ドメインU
性能
(req/s)
xflowあり
1.6MB
10.6MB
382
xflowなし
13.6MB
15.7MB
382
約60%のメモリーを削減
59
関連研究
Dflow pointcut [Masuhara ’03]
DJcutter [Nishizawa ’04]、DAC++ [Almajali ’05]
データの流れを選択するポイントカット
コンパイル時にdflowのためのコードを織り込み
分散環境に対応したアスペクト指向システム
ユーザーランドのアプリケーションを対象とする
Causeway [Chanda ’05]
メタデータを伝搬させ処理の流れを追跡
FreeBSDのネットワークI/Oコードを改造して実装
60
第2部のまとめ
xflowポイントカット
データフロー追跡をアスペクトとして容易に記述可能
複数ドメインに自動でアスペクトを織り込み
KLASYを拡張して実装
ケーススタディ
ネットワークI/Oのボトルネックがドメイン0の処理にあることを発見
フロー追跡機能により調査に必要なメモリー使用量の削減を確認
61
本発表のまとめ
DAOPをプロファイリングに使うことを提案
カーネルプロファイリングのための実用的な
DAOPシステムを提案
データを扱うポイントカットを提供
(1) accessポイントカット
(2) xflowポイントカット
データ利用箇所を選択するポイントカット
データフローを選択するポイントカット
従来のC言語用DAOPで不足
62
従来手法との比較
自由度
抽象度
イベントドリブン
×
○
動的コード挿入
○
×
本研究
○
○
63
今後の展開
他のアーキテクチャでの実装
フローの分割への対処
フロー分割後のフローIDの適切な割当方法の検討
VMM内部へのアスペクトの織り込み
x86以外のアーキテクチャで本方式が使えるかを検証
現在はOS内部だけなのでVMM内部にも織り込み、網羅的な調査を行いたい
統計的手法を用いたプロファイラとの連携
DAOPによるプロファイリングは正確な実行点を選択
突発的な変化に強いが外乱に弱い
統計的手法でならす
UIとの連携
行単位でのプロファイリングコードの挿入、削除
開発の効率をさらに上昇
64
既発表論文
Accessポイントカット
“OSカーネル用アスペクト指向システム KLASY”,情報処理学会
論文誌:プログラミング, vol. 48, no. SIG 10 (PRO33)
“A Dynamic Aspect-oriented System for OS Kernels”,
GPCE’06
Xflowポイントカット
“XenLASY: XenのI/O処理を追跡するためのアスペクト指向プ
ロファイラ”,情報処理学会論文誌:プログラミング, PRO35
掲載予定
65
業績リスト
査読付き論文
ワークショップ論文
滝澤裕二,光来健一,千葉滋,柳澤佳里: SAccessor: デスクトップPCのための安全なファイルアクセス制御システム,第19回コンピュータシステム・シンポ
ジウム (ComSys 2007), 東京都 東京ファッションタウン, 2007年11月27日
今吉竜之介, 柳澤佳里, 千葉滋: アスペクト指向言語のための独立性の高いパッケージシステム, 第11回 プログラミングおよび応用のシステムに関す
るワークショップ (SPA 2007), 愛知県 三谷温泉, 2007 年 9 月 3日 - 5日
滝澤裕二、光来健一、柳澤佳里、千葉滋: OSが乗っ取られた場合にも機能するファイルアクセス制御システム, 第10回 プログラミングおよび応用のシ
ステムに関するワークショップ (SPA X), 新潟県 越後湯沢温泉, 2006 年 8 月 28 - 30 日
柳澤 佳里, 光来 健一, 千葉 滋: アスペクト指向を用いたカーネルプロファイラ, 第99回 システムソフトウェアとオペレーティングシステム研究会, 沖縄県
ホテルムーンビーチ, 2005年 5月25-27日, 情報処理学会研究報告 2005-OS-99, pp.149-156
Yoshisato YANAGISAWA, Shigeru CHIBA, Kenichi KOURAI: A Source-level Kernel Profiler based on Dynamic Aspect-Orientation, Dynamic
Aspects Workshop (DAW05) Chicago, USA. March 15th, 2005 (held in conjunction with AOSD 2005)
柳澤佳里、光来健一、千葉滋: 通信処理のカーネル内競合を検出するアスペクト指向カーネルレベルロガー, 並列/分散/協調処理に関するサマー・
ワークショップ (SwoPP青森2004) 情報処理学会研究報告 2004-OS-97, pp.33-40, 2004年8月.
柳澤佳里、千葉滋: 他のプロセスに与える影響が少ない実行時ミラーリングシステム,並列/分散/協調処理に関するサマー・ワークショップ(SWoPP '03)
第94回OS研究会,松江、pp.83-89、2003年8月.
口頭発表(抜粋)
柳澤佳里, 光来健一, 千葉滋: XenLASY: XenのI/O処理を追跡するためのアスペクト指向プロファイラ, 第65回プログラミング研究会 (PRO-2007-2),
北海道 旭川市大雪クリスタルホール, 2007年8月1日 - 3日 (情報処理学会論文誌:プログラミング(PRO35)掲載予定)
柳澤佳里, 光来健一, 千葉滋, 石川零: OSカーネル用アスペクト指向システム KLASY, 情報処理学会論文誌:プログラミング、vol. 48, no. SIG 10
(PRO33)、pp.176-188、June 2007. (平成19年度コンピュータサイエンス領域奨励賞受賞)
Yoshisato Yanagisawa, Kenichi Kourai, Shigeru Chiba, and Rei Ishikawa: A Dynamic Aspect-oriented System for OS Kernels, In Proc. of the 5th
Int'l Conf. on Generative Programming and Component Engineering (GPCE'06), pp.69-78. Portland, Oregon, USA. October 22-26, 2006.
柳澤佳里, 光来健一, 千葉滋, 石川零:カーネル用アスペクト指向システム KLAS,第9回 プログラミングおよび応用のシステムに関するワークショップ
(SPA 2006), 栃木県 塩原温泉, 2006 年 3 月 5 - 7 日. (ポスター・デモセッション最優秀発表賞受賞)
Yoshisato YANAGISAWA, Shigeru CHIBA, Kenichi KOURAI: KLAS: Kernel Level Aspect-oriented System – Source-based Binary-level Dynamic
Weaving -, AOSD 2005 (poster), Chicago, Illinois, USA, March 16th, 2005. (Best Poster Award)
その他
第11回 プログラミングおよび応用のシステムに関するワークショップ(SPA 2007) 実行副委員長
66
© Copyright 2026 ExpyDoc