3 ftrace snapshotを作った、Kernel 3.9で利用可能になる
6 この発表においては、プログラムの実行を理解する上で有益なデータをバッファ等に記録すること
10 常時トレースを動かしておき、システムが停止した時にダンプを用いて理由を解析する
16 元々はRTツリーのFunction tracerから始まった (なのでftrace)
26 あらかじめ埋め込まれたトレースポイントを踏んだ時にイベントを記録
27 現在のLinux Kernelでは500以上が設定されている
29 Kernelの中のTrace bufferに記録される
36 Kernelsharkというツールで可視化出来る
39 カーネル内の全ての関数呼び出し・リターンを記録出来る
64 /sys/kernel/debug/tracing/ 以下にファイルが出来る
70 # cat trace するだけでバッファを読み出せる
73 書き込み可能、かつO_TRUNCでopenするとクリア
85 バッファが満杯になった時に上書きするか、記録をやめるか
86 1 -> 古いイベントを捨てる (デフォルト)
93 ユーザ空間からトレースバッファにイベントを記録する
94 write(2)で好きな文字列を書き込むだけで記録出来る
97 Kprobes event(2.6.33~)
98 動いているカーネルに動的に好きな場所にイベントを埋め込める
100 Uprobes event (2.6.35~)
103 Ojbdumpなどでアドレスを持ってくる必要がある
105 トレースを止めずに、ある瞬間のバッファのスナップショットを取る機能
106 予備のトレースバッファを用意しておいて、好きなタイミングで切り替える
110 バッファの割り当て時間が気になる場合は、あらかじめ1を書いてバッファを確保しておくと良い
112 トレースバッファを用途別に複数個使い分ける機能
113 今までは一つのグローバルバッファしかなかった(せいぜいCPU毎)
114 バッファの個数はmkdir/rmdirで動的に変更可能
115 # cd instances/; mkdir buf_1
116 今のところ、Trace Eventsのみ利用可能
118 特定の関数が呼ばれた時にアクションを起こす
120 特定のイベントが呼ばれたらトレースイベントをOn/Off
123 # echo 'vfs_read:snapshot:1' > set_ftrace_filter
127 local -> CPU間で同期を取らない
128 global -> ロックを取って同期させる
130 x86-tsc (3.8~) -> 生のTSC
131 local/globalはTSCをマイクロ秒などに変更している
132 uptime -> jiffersだけなので軽い
133 perf -> perfと同じタイムスタンプをつける
137 取りたいイベントをあらかじめOnにして、その後負荷の具合を見ながら調整する
138 記録する際にロックを取るなどによりメモリ帯域を食ってしまうことはないか
139 基本的にCPU間でロックを取ることはない(ロックレス)