通信処理のカーネル内競合を検出する アスペクト指向

通信処理のカーネル内競合を
検出するアスペクト指向
カーネルレベルロガー
柳澤 佳里* 光来 健一* 千葉 滋*
*東京工業大学大学院情報理工学研究科
数理計算科学専攻
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