動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (a dynamic...

26
1 動動動動動動動動動動動動動動 動動動動動動動動動動動動動動動 (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use) 動動 動動 動動動動 : 03M37311 動動動動 : 動動 動 動動動動動動 動動動動動動動動 動動 動動動動動動

Upload: clove

Post on 17-Jan-2016

32 views

Category:

Documents


0 download

DESCRIPTION

動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use). 柳澤 佳里 (学籍番号 : 03M37311 ) 指導教官 : 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻. カーネルプロファイリング. 動機: ネットワーク性能の劣化を調査 ダウンロード中に SSH のレスポンスが悪化 十分なネットワーク帯域があるのに発生 カーネル内にボトルネック? 疑わしい場所は無数に存在. カーネルプロファイラが必要. プロファイル. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

1

動的アスペクト指向に基づいた使いやすいカーネルプロファイラ(A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

柳澤 佳里 (学籍番号 : 03M37311 )指導教官 : 千葉 滋

東京工業大学 情報理工学研究科 数理・計算科学専攻

Page 2: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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

カーネルプロファイラが必

要プロファイル

Page 3: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

3

従来のカーネルプロファイリング技術

測定粒度が固定 関数単位 – μDyner [Marc ’03] サポートされた種類のイベント – LKST [ 畑崎

’ 03] 任意の粒度で測定

メモリ中のアドレスを直接指定 – KernInst [Ariel ’02] 構造体、ローカル変数、インライン関数、 static 関

数、マクロなどのアドレスが実行時に消失

Page 4: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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

Page 5: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

5

KLAS (Kernel Level Aspect-oriented System)

Source-based binary-level dynamic weaving カーネル用アスペクト指向システム

ソースレベルで挿入コードと位置を指定 アスペクトを XML として記述

動的にコード挿入 再コンパイル・再起動が不要

任意の処理を指定可能 コンパイラの改造によりシンボル情報を拡張

実行時に weaver がシンボル情報を利用可能に

Page 6: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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; ….}

Page 7: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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 へのアクセスをポイントカッ

トとして抽出

ポイントカット位置で時間を表示

Page 8: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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; …

挿入

Page 9: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

9

実装の概要

シンボル情報

アスペクト( XML )

OS ソースコード

アドレスリゾルバ

コンパイル済アドバイス

フック挿入

OS カーネル

(FreeBSD)

KLAS

アドバイスローダ

KLAS_gcc

シンボル情報抽出

コンパイル

フック

Page 10: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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

3

KLAS_gcc

Page 11: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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

拡張シンボル情報

対応するファイル名、行 アドレス

構造体名メンバ名

Page 12: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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)

Page 13: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

13

フック挿入:カーネルへのフック埋め込み

ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しない

動作BPT

フック挿入

アドレスマップコンパイル済みアドバイス

2.アドレスマップに登録

3. BPT 挿入

1.アドバイスのアドレスを取得

Page 14: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

14

フック挿入:カーネルへのフック埋め込み

ブレークポイントトラップ (BPT) をフックに使用 x86 では 1byte 命令で実行フローを破壊しない

動作 (フック作動時)BPT

フック挿入

アドレスマップコンパイル済みアドバイス

トラップ処理ルーチン

1.処理が遷移

2.対応アドバイスの確認

3.アドバイスを実行

Page 15: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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オーバーヘッドが原因 ?

Page 16: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

16

実験 II: フック数と実行時間 目的

フックの数と実行時間の変化の調査

実験内容 システムコールの実行

時間を測定 システムコール内で千個の関数を順に呼び出し

各関数に挿入するアスペクトは高々 1つ

アドバイス内容は空

実験結果

非線形に増加線形リストによる実装が原因

Page 17: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

17

関連研究 (1) アスペクト指向システム

AspectC++ [Olaf ’02] ソースレベルのアスペクト指向システム 実行時のフック埋め込みは不可

μDyner [Marc ’03] 動的にフック埋め込みを実施 コンパイル時にフック埋め込み可能箇所が決定

ポイントカット可能位置の増加でコードサイズが増加

Page 18: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

18

従来のC/C++ 用アスペクト指向システム

動的アスペクト指向システム シンボル情報が少なくポイントカット指定が限定的

関数の先頭のみをポイントカットとして指定可能 コンパイル時に構造体、マクロの情報が消失

静的アスペクト指向システム ポイントカット、アドバイスの変更のたびに

再コンパイル、再起動が必要 再起動によりメモリ内容が消失 再起動には長時間消費し開発効率が低下

KLAS ではシンボル情報を拡張し、実行時に構造体、マクロをポイントカット可能

Page 19: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

19

関連研究 (2) カーネルプロファイラ

LKST [ 畑崎 ’ 03] 決められたイベントの箇所でログ出力可能 KLAS は関数呼び出し、構造体アクセスでログ出力可能

カーネルコード変換 KernInst [Ariel ’02]

Solaris版はジャンプ , Linux版は BPT でフックを実現 カーネル内の任意の箇所にコード挿入可能 バイナリの情報のみ使用可能 KLAS はソースレベルの情報で指定可能

Page 20: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

20

まとめ カーネル用アスペクト指向システム KLAS の提案

FreeBSD 5.2.1 、 gcc 3.3.4 を改造して実装 ソースコードを参照し、実行中のバイナリにフック埋め込

み コンパイラを改造し、シンボル情報を拡張 拡張したシンボル情報を用いてフック埋め込みアドレスを取得 フックとして BPT を使用

実験 カーネルコンパイル時間が約 2倍となることがわかった フックの数に対して非線形に消費時間が増加することがわかった

Page 21: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

21

今後の課題 コンパイラ性能の改善

バッファリングによる I/Oオーバーヘッドの軽減

フックアドレス、アドバイスマップの改善 データ構造の変更による所要オーダーの軽減

フックをより正確な位置に挿入 現在は行単位でフックを挿入

アスペクト間の依存関係の取り扱いの実現 存在しないデータをアクセスする危険性の除去

Page 22: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

22

Page 23: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

23

Page 24: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

24

カーネルプロファイラに必要な機能

実行時に時間測定箇所を変更可能 プロファイリングが進むと測定範囲を縮小

時間測定のコードを指定可能 ログを取得するため

C言語に対応 多くの OS カーネルのコードは C言語で書かれる

測定の影響を最小化 測定誤差を最小化

時間測定箇所を細密に指定可能 測定の精度を高めたい

Page 25: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

25

OS カーネル

(FreeBSD)

実装の概要アスペクト( XML )

KLASアスペクトローダ

アドレスリゾルバ

フック挿入

シンボル情報

OS カーネルソースコード

KLAS_gcc

シンボル情報抽出コンパイル

アスペクトをコンパイル

コンパイル済みアスペクト

Page 26: 動的アスペクト指向に基づいた 使いやすいカーネルプロファイラ (A Dynamic Aspect Oriented Kernel Profiler for Ease of Use)

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

シンボル情報