* memo for 8th Kernel/VM expedition
[lab.git] / Commentary / kernelvm / 20130413.log
1 豊岡拓
2
3         ftrace snapshotを作った、Kernel 3.9で利用可能になる
4         
5         トレースとは
6                 この発表においては、プログラムの実行を理解する上で有益なデータをバッファ等に記録すること
7         用途
8                 デバッグ
9                 障害解析
10                         常時トレースを動かしておき、システムが停止した時にダンプを用いて理由を解析する
11                 性能解析
12                         どこが時間を食っているのか
13                         ボトルネック解析
14         ftrace
15                 カーネルに組み込まれているトレース機構
16                 元々はRTツリーのFunction tracerから始まった (なのでftrace)
17                 現在では様々なトレース機能が統合されている
18                         Events
19                         Latency
20                                 最大の割り込み禁止期間を知りたい
21                         Stack
22                         Block, mmio
23                         Dynamic events
24                                 好きなところにbreakpointを設置
25         Trace Events
26                 あらかじめ埋め込まれたトレースポイントを踏んだ時にイベントを記録
27                 現在のLinux Kernelでは500以上が設定されている
28                         syscallを含めるともっと
29                 Kernelの中のTrace bufferに記録される
30                 記録されるデータ
31                         PID
32                         CPUID
33                         タイムスタンプ
34                         イベント名
35                         イベント毎の引数
36                 Kernelsharkというツールで可視化出来る
37                         Fedoraには標準である
38         Function Tracer
39                 カーネル内の全ての関数呼び出し・リターンを記録出来る
40                 コールグラフ、処理時間が分かる
41         Irqsoff Tracer
42                 最大の割り込み禁止区間を検出
43                 「最大で8013us発生したよ」
44                         RTOSだとかなり大きい遅延
45         ftraceの全体像
46                 hook mechanisms
47                         mcount
48                         tracepoint
49                         kprobes
50                         (uprobes)
51                 plugin tracers
52                         function
53                         irqsoff
54                         wakeup
55                 stack trace
56                 trace event
57                 common components
58                         debugfs I/F
59                         ring buffer
60         debugfs経由で操作
61                 /procの様なもの
62                 疑似ファイルをecho, catする
63                 trace-cmd
64         /sys/kernel/debug/tracing/ 以下にファイルが出来る
65         current_tracer
66                 どのpluginを使うか指定する
67         トレースバッファ
68                 ロックレスリングバッファ
69                 記録を読み出しを並行して行える
70         # cat trace するだけでバッファを読み出せる
71                 テキスト形式
72                 バッファ内のデータは消費されない
73                 書き込み可能、かつO_TRUNCでopenするとクリア
74                         # echo > trace
75         trace_pipe
76                 traceに似ている
77                 バッファ内のデータを読んだ際に消費する
78         trace_pipe_raw
79                 バイナリ形式で生の情報を出力する
80                 splice(2)でゼロコピー転送が可能
81                 cpu毎のI/Fしかない
82                         一度に全部のCPUを読み込むことは出来ない
83         options/
84                 options/overwrite
85                         バッファが満杯になった時に上書きするか、記録をやめるか
86                         1 -> 古いイベントを捨てる (デフォルト)
87                         0 -> 記録停止
88         events/
89                 イベントの有効・無効を制御
90         filter
91                 特定の条件を満たすイベントだけを記録出来る
92         trace_marker
93                 ユーザ空間からトレースバッファにイベントを記録する
94                 write(2)で好きな文字列を書き込むだけで記録出来る
95                 アプリケーションの動作チェックなどに有用
96         最近入った・入る予定の機能
97         Kprobes event(2.6.33~)
98                 動いているカーネルに動的に好きな場所にイベントを埋め込める
99                 カーネルの改造不要
100         Uprobes event (2.6.35~)
101                 Kprobesのユーザ空間番
102                 アプリケーションの改造不要
103                 Ojbdumpなどでアドレスを持ってくる必要がある
104         Snapshot(3.9~)
105                 トレースを止めずに、ある瞬間のバッファのスナップショットを取る機能
106                 予備のトレースバッファを用意しておいて、好きなタイミングで切り替える
107         # echo 1 > snapshot
108                 これだけでスナップショットが取られる
109                 この際に予備のバッファも割り当てられる
110                 バッファの割り当て時間が気になる場合は、あらかじめ1を書いてバッファを確保しておくと良い
111         Multi-buffer(3.10~?)
112                 トレースバッファを用途別に複数個使い分ける機能
113                 今までは一つのグローバルバッファしかなかった(せいぜいCPU毎)
114                 バッファの個数はmkdir/rmdirで動的に変更可能
115                 # cd instances/; mkdir buf_1
116                 今のところ、Trace Eventsのみ利用可能
117         Function-trigger
118                 特定の関数が呼ばれた時にアクションを起こす
119                 トーレス全体のOn/Off
120                 特定のイベントが呼ばれたらトレースイベントをOn/Off
121                 スナップショットを取る
122                 スタックトレースを取る
123                 # echo 'vfs_read:snapshot:1' > set_ftrace_filter
124         trace_clock
125                 タイムスタンプの種類を変更出来る
126                 基本的にはTSCベース
127                 local -> CPU間で同期を取らない
128                 global -> ロックを取って同期させる
129                 counter -> 順番だけを見たい時
130                 x86-tsc (3.8~) -> 生のTSC
131                         local/globalはTSCをマイクロ秒などに変更している
132                 uptime -> jiffersだけなので軽い
133                 perf -> perfと同じタイムスタンプをつける
134         Q/A
135                 オーバーヘッドはどれくらいか
136                         どれくらいのイベントをOnにするかによる
137                         取りたいイベントをあらかじめOnにして、その後負荷の具合を見ながら調整する
138                 記録する際にロックを取るなどによりメモリ帯域を食ってしまうことはないか
139                         基本的にCPU間でロックを取ることはない(ロックレス)
140