通信処理のカーネル内競合を
検出するアスペクト指向
カーネルレベルロガー
柳澤 佳里* 光来 健一* 千葉 滋*
*東京工業大学大学院情報理工学研究科
数理計算科学専攻
1
カーネルレベルロガーの必要性
カーネル内の競合が疑われるケースがある
リモートログイン と バルク通信の競合
ネットワーク・カーネルの両方での競合の可能性
E.g.)ダウンロード中にリモートログインすると反応が遅い
E.g.)CPUの競合により送受信処理が滞る
カーネル内でログを取れることが必要
Tcpdumpなど既存のツールでは内部の処理が見えず不十分
write(2)
read(2)
カーネル
}
見えない
デバイス
ネットワーク
2
Printfによるログ出力の問題点
コードを挿入するたびに再起動はしたくない
コード挿入後再起動が必要で動作するまでに時間が
かかる
カーネル・ネットワークの状況が変わる
再起動時にメモリ内容、接続情報は消去される
コード挿入作業は煩雑
入れ忘れるとコードを挿入し再起動
とり忘れると性能低下、情報漏えい
n_time
ip_time()
{
…
printf(“%ld\n”,..);
…
3
フラグによるログ出力切り替えの問題点
実行時オーバーヘッドが常にかかる
ログ出力できる箇所が増えるとフラグチェックのオー
バーヘッド大
そのオーバーヘッドを減らそうとすると十分なログが
取れない可能性がある
ログ出力を細かく制御しようとするとフラグ数が
n_time
爆発
ip_time()
メモリ使用量大
フラグの構造化された
管理機構が必要
{
if (flag1)
printf(...);
…
if (flag2)
printf(...);
4
カーネル用アスペクト指向システム
ログコードと挿入箇所をアスペクトとして記述
アスペクトを動的に挿入、削除
カーネル本体から分離して記述できる
再起動不要
挿入箇所以外の実行時オーバーヘッドは低い
アスペクトとしてまとめて関連箇所にコード挿入、
削除
入れ忘れやとり忘れを防ぎやすい
Eg) *_output関数呼び出しの箇所すべて、など
5
アスペクトとは
ポイントカット
ログコード挿入できる箇所
(ジョインポイント)を指定
関数呼び出し
変数アクセスの指定
call/execution
set/get
アドバイス
ポイントカットで指定した
位置に挿入するログコード
ジョインポイントの例
n_time
Iptime()
関数実行箇所
{
…
関数呼び出し
getmicrotime(&atv);
t=…
return (htonl(t));
}
変数への参照、代入
6
例: 特定箇所でロギング
int
ip_fastforward(struct mbuf *m)
{
…
divert_packet(teem,..);
…
}
void
ip_input(struct mbuf *m)
{
…
divert_packet(m,...);
…
}
アスペクト
ポイント
カット
aspect log_dequeue {
pointcut call(“
void divert_packet(
struct mbuf *m,int ..)”);
before(struct mbuf *m) {
logging(m);
}
}
アドバイス
divert_packetを呼んでいる位置の前で
logging(m)を実行
7
例: データの追跡
void
ip_input(struct mbuf *m)
{
….
m = m->m_next;
…
}
void
tcp_input(m, off0)
{
…
for(; m && …)
…
}
アスペクト
ポイント
カット
aspect trace_mbuf {
pointcut get(mbuf *m);
before(mbuf *m) {
logging(m);
}
}
アドバイス
Mbuf構造体の値を参照している位置の前で
logging(m)を実行
8
アスペクトのカーネルへの適用(weave)
アスペクト記述
1. ポイントカット位置の検索
2. ポイントカット位置とアドバイスの対応付け
コンパイル
OSカーネル
weave
アスペクト
(カーネル内部表現)
カーネル内表現
•ポイントカット記述子
•コンパイル済みアドバイス
9
Call/executionポイントカットの実現方法
関数呼び出し箇所、実行箇所にてアドバイスを
実行
実現方法: ブレークポイント トラップ(BPT)
実行時
(a) BPTの発生
Weave時
• 元の命令の保存
• BPTの挿入
BPT
trap(..) {
exec_advice()
exec_inst()
}
(b)adviceの実行
(c)Weave時に
保存した命令の実行
10
ブレークポイントによる実現の利害
利点
実行フローを破壊しない
Jmp/call命令(5byte命令)で実現すると飛び先を上書きする
恐れ
mov $0x1, %eax
Weaveした点以外の実行時間は不変
ブレークポイント命令は1byte命令
Weaveした点のみコード書き換え
call func 0
…
jmp label1
欠点
ブレークポイント命令の実行は遅い
カーネルではプロセス間のコンテキストスイッチが
無い分だけ軽い
11
}
Set/getポイントカットの実現方法
変数の代入、参照箇所でアドバイスを実行
デバッグレジスタによる実現
ポイントカットする変数のアドレスをデバッグレジスタに
登録
デバッグレジスタに格納されたアドレスへのアクセスでトラップ
ページフォールト トラップによる実現
ポイントカット箇所の入ったページを書き込み/読み込み
禁止に設定
ページへの読み書きでページフォールトトラップ
(b)割り込み
(a)アクセス
mbuf領域
Weave時に
アクセス禁止設定
trap(..)
{
advice
}
12
ページフォールトによる実現の利害
利点
ポインタによるアクセスにも対応可能
静的な解析ではわからない
ポインタによる変数アクセスの箇所すべてでステップ実行が必要
欠点: 実行時オーバーヘッド
同一ページ内の関係ない変数アクセス時も発生
Mbuf全体への使用ではオーバーヘッド小
Mbuf領域は連続して確保
Mbuf領域はページあたりの個数が小
13
実験I: 割り込みと関数呼び出しの比較
関数呼び出し(call命令)、ブレークポイント割り込み(int3
命令)にかかる実行時間時間の比較
カーネル内部で実験
実験時はsti命令でその他の割り込みの禁止
実験環境
CPU: Athlon XP 2200+, Mem: 1GB
FreeBSD 5.2.1R-p8
実験結果
Call命令
Int3命令
Getpid(2)システムコール
15 clocks
373 clocks
28,596 clocks
14
実験II: 割り込み挿入時の
ネットワーク処理性能
ブレークポイント割り込み挿入時のTCPスループットを
測定
ip_outputへのint3の埋め込み数を変えて実験
OS: FreeBSD 5.2R
CPU: Athlon 2200+
Mem: 1GB
NIC: Intel Ethernet Pro
クライアント
OS: FreeBSD 4.10R
CPU: Athlon 2200+
Mem: 1GB
NIC: Intel Ethernet Pro
サーバー
Network
100Mbps
switching-HUB
15
実験結果II: 割り込み挿入時のネット
ワークの性能低下の調査
割り込みの数
00
10
0
80
0
60
0
40
0
(Mbps)
100
90
ス
ル 80
ー 70
プ
ッ 60
ト
50
40
30
20
10
0
20
300回以下の割り込み数
ではスループットの低下
無し
300回以上ではほぼ線形
に性能劣化
0
16
関連研究(1)
Aspect指向言語
AspcetC++ [Olaf ’02]
コンパイル時にweaveを行う
実行時に必要となった箇所へのログ埋め込みは不可
μDyner [Marc ’03]
動的にweaveを行う
コンパイル時に関数の頭にnop命令を挿入しておく
コンパイル時に決めた箇所のみweave可能
Nop命令の実行によりweaveしていない時でも性能劣化
17
関連研究(2)
カーネルロガー
LKST [畑崎 ’03]、 KTR
決められたイベントの箇所でのみログ出力可能
カーネルレベルでのコード挿入
Kerninstd [Ariel ’02]
カーネル内のほぼ任意の箇所にコード挿入
基本ブロックの解析をしてjmp命令で実装
機械語レベルに挿入するので使いにくい
18
まとめ
カーネル用アスペクト指向システムの提案
ブレークポイントトラップによりExecution/callポイントカットを実現
システムコール内部で呼んだ際に影響が少ないことを実験で確認
300回以下の場合にスループットに影響がほぼ無いことを実験で
確認
デバッグレジスタ、ページフォールトトラップによりSet/getポイントカッ
トを実現
19
今後の課題
実装
性能評価
作成したシステムを用いてリモートログインとバルク
通信の競合を調査
データ構造が変化しても追跡してロギング
E.g.) Network I/Oでは配列からmbufへのデータが変化
利用者からヒントをもらうとできる?
利用者は前後にポイントカットを挿入可能
20
© Copyright 2026 ExpyDoc