Document

動的アスペクト指向に基づいた
使いやすいカーネルプロファイラ
(A Dynamic Aspect Oriented Kernel Profiler for
Ease of Use)
柳澤 佳里 (学籍番号: 03M37311)
指導教官: 千葉 滋
東京工業大学 情報理工学研究科 数理・計算科学専攻
1
カーネルプロファイリング

動機: ネットワーク性能の劣化を調査



ダウンロード中にSSHのレスポンスが悪化
十分なネットワーク帯域があるのに発生
カーネルプロ
ファイラが必要
カーネル内にボトルネック?
疑わしい場所は無数に存在
プロファイル

if_output
write
socket
TCP
IP
datalink
2
従来のカーネルプロファイリング技術

測定粒度が固定



関数単位 – μDyner [Marc ’03]
サポートされた種類のイベント – LKST [畑崎 ’03]
任意の粒度で測定

メモリ中のアドレスを直接指定 – KernInst [Ariel ’02]

構造体、ローカル変数、インライン関数、static関数、マク
ロなどのアドレスが実行時に消失
3
プロファイルできない例

構造体メンバへの代入を逐一プロファイル

mbuf構造体 - ネットワークI/Oで多用
tcp_output(…)
struct mbuf {
struct m_hdr m_hdr;
{
…
struct mbuf *m;
}
m->m_len = hdrlen; #define m_len m_hdr.m_len
…
}
アドレス情報はバイナリに欠如


アドレスの直指定はユーザに重荷
測定したい処理のアドレスを特定できない
4
KLAS (Kernel Level Aspectoriented System)

Source-based binary-level dynamic weaving

カーネル用アスペクト指向システム



動的にコード挿入


ソースレベルで挿入コードと位置を指定
アスペクトをXMLとして記述
再コンパイル・再起動が不要
任意の処理を指定可能

コンパイラの改造によりシンボル情報を拡張

実行時にweaverがシンボル情報を利用可能に
5
KLASにより指定可能となる処理

関数ポインタ呼び出し


カーネル内のポリモル
フィズム的コードで多用
E.g.) VFS、ファイル、ソ
ケットなどの入出力
fo_read(…)
{
return ((*fp->f_ops->fo_read(…));
}

データアクセス


まとまったデータのやり
取りを行う箇所で多用
E.g.) mbuf、ファイル
キャッシュの統計情報
tcp_input(…)
{
…
m->m_len += hdrlen;
m->m_data -= hdrlen;
….
}
6
KLASの文法
m_lenへのアクセス
をポイントカットとし
て抽出
<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> ポイントカット位置
で時間を表示
7
KLASの文法
m_lenへのアクセス
をポイントカットとし
て抽出
<aspect name=“log_reset_len”>
<pointcut>
<field name=“m_len” structure=“mbuf” />
</pointcut>
<advice>
tcp_output(…)
struct timespec ts;
{
struct mbuf *m;
nanotime(&ts);
struct timespec ts;
printf(…);
…..
</advice>
printf(…)
</aspect>
m->m_len = hdrlen;
…
8
実装の概要
アスペクト
(XML)
OSソースコード
KLAS_gcc
KLAS
アドバイス
ローダ
アドレス
リゾルバ
フック
挿入
コンパイル済アドバイス
シンボル
情報
フック
シンボル情報抽出
OSカーネル
(FreeBSD)
コンパイル
9
KLAS_gccの実装


gcc 3.3.4を改造
出力するシンボル情報を拡張

構造体メンバアクセスのファイル名、行を出力
ip_output(…) {
struct mbuf *m0;
…
m0->m_pkthdr
…
}
1
シンボル情報
ハッシュ表
2
KLAS_gcc
3
/usr/…/ip_output.c:879:mbuf.m_pkthdr
1. ハッシュ表に構造体名、IDを保存
2. IDをキーにして構造体名を取得
3.
10
ファイル名、行番号、構造体名、メ
ンバ名を出力
アドレスリゾルバ:
メンバアクセスとアドレスの対応

構造体名、メンバ名を渡すと対応するファイル
名、行情報の一覧を得る


拡張シンボル情報を検索
ファイル名、行情報よりアドレスを得る

バイナリに入っているデバッグ情報を調査
拡張シンボル情報
構造体名
メンバ名
…
/usr/…put.c:175:ip.ip_v
/usr/…put.c:176:ip.ip_hl
…
/usr/…257:mbuf.m_flags
35
debug_info
2
対応する
ファイル名、行
0
4
1
“ip_output.c”
“GNU C Compiler”
“frodo:/usr/src/sys/…”
…
アドレス
11
アドバイスローダ:
アドバイスのカーネル内部へのロード

カーネルモジュール(KM)としてロード


KMでは重複しない任意の関数をロード、使用可能
動作
ヘッダ
アドバイス
フッタ
#include <sys/types.h>
#include <sys/module.h>
…
static int log_mbuf_loader(…) {
…
}
int log_mbuf(….) {
struct timespec ts;
nanotime(&ts);
printf(… ts.tv_nsec);
}
DECLARE_MODULE(…ANY);
コンパイル済みアドバイス
(カーネルモジュール)
ロード(kldload)
OSカーネル
12
フック挿入:
カーネルへのフック埋め込み

ブレークポイントトラップ(BPT)をフックに使用


x86では1byte命令で実行フローを破壊しない
動作
3.BPT挿入
BPT
フック挿入
コンパイル済みアドバイス
1.アドバイスのアドレスを取得
アドレスマップ
2.アドレスマップに登録
13
フック挿入:
カーネルへのフック埋め込み

ブレークポイントトラップ(BPT)をフックに使用


x86では1byte命令で実行フローを破壊しない
動作 (フック作動時)
BPT
1.処理が遷移
フック挿入
トラップ処理ルーチン
3.アドバイスを実行
2.対応アドバイス
コンパイル済みアドバイス
の確認
アドレスマップ
14
実験I:カーネルコンパイル時間

実験内容

KLAS_gccのオーバーヘッドを測定


実験環境


KLAS_gcc、gccのカーネルコンパイル時間を比較
CPU: AMD Athlon 2200+, Mem: 1GB, HDD: UDMA133
実験結果
総実行時間(秒)
gcc
KLAS_gcc
294.25
527.86
User
System
211.72
223.06
System時間が大きい
I/Oオーバーヘッドが原因?
79.54
301.07
15
実験II: フック数と実行時間

目的



実験結果
フックの数と実行時間の
変化の調査
実験内容




システムコールの実行時
間を測定
システムコール内で千個
の関数を順に呼び出し
各関数に挿入するアスペ
クトは高々1つ
アドバイス内容は空
非線形に増加
16
線形リストによる実装が原因?
関連研究(1)

アスペクト指向システム

AspectC++ [Olaf ’02]



ソースレベルのアスペクト指向システム
実行時のフック埋め込みは不可
μDyner [Marc ’03]


動的にフック埋め込みを実施
コンパイル時にフック埋め込み可能箇所が決定

ポイントカット可能位置の増加でコードサイズが増加
17
従来の
C/C++用アスペクト指向システム

動的アスペクト指向システム

シンボル情報が少なくポイントカット指定が限定的

関数の先頭のみをポイントカットとして指定可能


コンパイル時に構造体、マクロの情報が消失
静的アスペクト指向システム

ポイントカット、アドバイスの変更のたびに
再コンパイル、再起動が必要


再起動によりメモリ内容が消失
再起動には長時間消費し開発効率が低下
KLASではシンボル情報を拡張し、実行時に構造体、マクロをポイントカット可能
18
関連研究(2)

カーネルプロファイラ

LKST [畑崎 ’03]



決められたイベントの箇所でログ出力可能
KLASは関数呼び出し、構造体アクセスでログ出力可能
カーネルコード変換

KernInst [Ariel ’02]




Solaris版はジャンプ, Linux版はBPTでフックを実現
カーネル内の任意の箇所にコード挿入可能
バイナリの情報のみ使用可能
KLASはソースレベルの情報で指定可能
19
まとめ

カーネル用アスペクト指向システムKLASの提案


FreeBSD 5.2.1、gcc 3.3.4を改造して実装
ソースコードを参照し、実行中のバイナリにフック埋め込み




コンパイラを改造し、シンボル情報を拡張
拡張したシンボル情報を用いてフック埋め込みアドレスを取得
フックとしてBPTを使用
実験


カーネルコンパイル時間が約2倍となることがわかった
フックの数に対して非線形に消費時間が増加することがわ
かった
20
今後の課題

コンパイラ性能の改善


フックアドレス、アドバイスマップの改善


データ構造の変更による所要オーダーの軽減
フックをより正確な位置に挿入


バッファリングによるI/Oオーバーヘッドの軽減
現在は行単位でフックを挿入
アスペクト間の依存関係の取り扱いの実現

存在しないデータをアクセスする危険性の除去
21
22
23
カーネルプロファイラに必要な機能

実行時に時間測定箇所を変更可能


時間測定のコードを指定可能


多くのOSカーネルのコードはC言語で書かれる
測定の影響を最小化


ログを取得するため
C言語に対応


プロファイリングが進むと測定範囲を縮小
測定誤差を最小化
時間測定箇所を細密に指定可能

測定の精度を高めたい
24
実装の概要
アスペクト
(XML)
KLAS
アスペクトを
コンパイル
KLAS_gcc
アスペクトローダ
アドレスリゾルバ
OSカーネル
ソースコード
シンボル
情報
シンボル情報抽出
フック挿入
コンパイル済み
アスペクト
コンパイル
OSカーネル
(FreeBSD)
25
KLAS_gccの実装


gcc 3.3.4を改造
出力するシンボル情報を拡張

構造体メンバアクセスのファイル名、行を出力
ip_output(…) {
struct mbuf *m0;
…
m0->m_pkthdr
…
}
1.ハッシュ表に
構造体名、IDを保存
ハッシュ表
2.IDをキーにして構造体名を取得
3.ファイル名、行番号、構造体名、メンバ名を出力
シンボル情報
/usr/…/ip_output.c:879:m0.m_pkthdr
26