ftraceの解説と最近の動向 @第8回カーネル/VM探検隊 (株)日立製作所 横浜研究所 豊岡 拓 <[email protected]> Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved Agenda • ftraceとは • 使い方 • 最近の動向 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 2 トレースとは • 「プログラミングにおいて、命令の実行された形跡をた どること」 – 出典: http://ja.wikipedia.org/wiki/トレース • この発表で言うトレースは、プログラムの実行を理解 する上で有益なデータをバッファ等に記録すること 実行パス トレースポイント /イベント トレースバッファ Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 3 トレースの用途 • デバッグ • 障害解析 • 性能解析 – ボトルネック解析 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 4 ftrace • Linuxカーネルに組込まれているトレース機構 – 元々はRTツリーのFunction tracerから始まった – メンテナ: Steven Rostedt氏 • 今では色んなトレース機能が統合されている – Events (tracepoints) – Latency (irq, preempt, wakeup) – Stack – Block, mmio – Dynamic events (Kprobes, Uprobes) Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 5 Trace Events • あらかじめ埋め込まれたトレースポイントを 踏んだ時にイベントを記録 syscall, sched, kmem, irq, fs, kvm, trace etc... point gnome-panel-1716 trace-cmd-3844 trace-cmd-3844 ome-panel-1716 ls-3845 ls-3845 ls-3845 gration/3-17 ...... [001] [002] [002] [001] [003] [003] [003] [003] 970.096184: 970.096185: 970.096188: 970.096188: 970.096192: 970.096193: 970.096194: 970.096196: event handler sched_stat_runtime: sched_stat_runtime: sched_switch: sched_switch: sched_wakeup: sched_stat_runtime: sched_switch: sched_stat_wait: trace buffer comm=gnome-panel pid=1716 runtime=31888 comm=trace-cmd pid=3844 runtime=230692 trace-cmd:3844 S ==> swapper/2:0 gnome-panel:1716 S ==> swapper/1:0 migration/3:17 [0] success=1 CPU:003 comm=trace-cmd pid=3845 runtime=93127 trace-cmd:3845 R ==> migration/3:17 comm=trace-cmd pid=3845 delay=4131 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 6 Trace Events • あらかじめ埋め込まれたトレースポイントを 踏んだ時にイベントを記録 プロセス名-PID タイムスタンプ CPU番号 gnome-panel-1716 trace-cmd-3844 trace-cmd-3844 ome-panel-1716 ls-3845 ls-3845 ls-3845 gration/3-17 ...... [001] [002] [002] [001] [003] [003] [003] [003] 970.096184: 970.096185: 970.096188: 970.096188: 970.096192: 970.096193: 970.096194: 970.096196: イベント名 sched_stat_runtime: sched_stat_runtime: sched_switch: sched_switch: sched_wakeup: sched_stat_runtime: sched_switch: sched_stat_wait: イベントごとの 引数 comm=gnome-panel pid=1716 runtime=31888 comm=trace-cmd pid=3844 runtime=230692 trace-cmd:3844 S ==> swapper/2:0 gnome-panel:1716 S ==> swapper/1:0 migration/3:17 [0] success=1 CPU:003 comm=trace-cmd pid=3845 runtime=93127 trace-cmd:3845 R ==> migration/3:17 comm=trace-cmd pid=3845 delay=4131 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 7 Trace Events • Kernelshark Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 8 “Function” Tracer • カーネル内の関数呼び出し/リターンを記録 – コールグラフ、処理時間が分かる ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_exit: ls-75 funcgraph_exit: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_entry: ls-75 funcgraph_exit: ls-75 funcgraph_exit: ls-75 funcgraph_exit: ...... call~retの時間 0.054 0.446 0.883 0.055 0.057 0.056 1.291 1.732 3.402 | path_put() { | dput() { | _raw_spin_lock() { us| do_raw_spin_lock(); us| } us| } | mntput() { | mntput_no_expire() { us| vfsmount_lock_local_lock(); us| mnt_add_count(); us| vfsmount_lock_local_unlock(); us| } us| } us| } コールグラフ Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 9 “Irqsoff” Tracer • 最大の割り込み禁止区間を検出 # irqsoff latency trace v1.1.5 on 3.8.0+ # -------------------------------------------------------------------# latency: 8013 us,#26/26, CPU#1 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:2) # ----------------# | task: at-spi2-registr-1185 (uid:1000 nice:0 policy:0 rt_prio:0) # ----------------# => started at: __wake_up_sync_key # => ended at: __wake_up_sync_key # at-spi2--1185 0us : _raw_spin_lock_irqsave <-__wake_up_sync_key at-spi2--1185 0us : __wake_up_common <-__wake_up_sync_key at-spi2--1185 1us : ep_poll_callback <-__wake_up_common at-spi2--1185 5us : native_smp_send_reschedule <-try_to_wake_up at-spi2--1185 5us!: flat_send_IPI_mask <-native_smp_send_reschedule at-spi2--1185 8012us : ttwu_stat <-try_to_wake_up at-spi2--1185 8013us : _raw_spin_unlock_irqrestore <-try_to_wake_up at-spi2--1185 8013us : _raw_spin_unlock_irqrestore <-ep_poll_callback at-spi2--1185 8013us : _raw_spin_unlock_irqrestore <-__wake_up_sync_key at-spi2--1185 8014us : _raw_spin_unlock_irqrestore <-__wake_up_sync_key at-spi2--1185 8014us+: trace_hardirqs_on <-__wake_up_sync_key Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 10 ftrace全体像 common components debugfs I/F ring buffer plugin tracers function irqsoff wakeup stack trace trace events hook mechanisms mcount tracepoint kprobes Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 11 ftrace使い方 • debugfs経由で操作 # mount debugfs /sys/kernel/debug/ 擬似ファイルを echo とか cat する • 他にも下記のツールが利用可能 – trace-cmd (コマンドラインツール) – kernelshark (GUI) Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 12 /sys/kernel/debug/tracing/ tracing/ current events/ options/ per_cpu/ _tracer Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved trace 13 current_tracer • (プラグイン)トレーサを設定 – 初期状態はnop # echo function > current_tracer # echo irqsoff > current_tracer – trace eventやstack tracerは並行して利用できる Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 14 トレースバッファ • トレース結果を記録しておくためのバッファ • ロックレス・リングバッファ – 記録と読み出しを並行して行える • CPU毎にバッファを持つ CPU 0 CPU 1 CPU 2 CPU 3 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 15 trace • trace – トレースバッファの読み出し # cat trace – テキスト形式 – バッファ内のデータは消費されない – 書き込み可能&O_TRUNCでopenするとクリア # echo > trace Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 16 trace_pipe, trace_pipe_raw • trace_pipe – “trace”に似ている – バッファ内のデータを消費する点が異なる • trace_pipe_raw – バイナリ形式で出力 – splice(2)で別のファイルにゼロコピー転送が可能 – per cpuのみ Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 17 options/ • トレースの挙動や結果表示の細かい設定 • 例: options/overwrite – バッファが満杯になった時に上書きするか、記録を やめるかを選べる • 1: 古いイベントを捨てる(default)=上書き • 0: 新しいイベントを捨てる=それ以上の記録を停止 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 18 events/ • events/event_class/event_name/enable – 特定のイベントを有効化(1)/無効化(0) # echo 1 > events/kmem/kmalloc/enable # echo 1 > events/kmem/enable Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 19 filter • 特定の条件を満たすイベントだけを記録できる # cd events/signal/signal_generate/ # echo "(sig == 5 || sig >= 10) && comm != bash” > filter Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 20 trace_marker • ユーザ空間からトレースバッファにイベントを記 録する • write(2)で好きな文字列を書き込み • チェックポイントを付けたい時に便利 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 21 Ftraceの動向 • 最近入った/入る予定の機能 – kprobes – uprobes – スナップショット – マルチバッファ – function-trigger – trace_clock (x86-tsc, perf, uptime) Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 22 Kprobes event (2.6.33~) • 動いているカーネルの好きな場所にイベントを 埋め込める – カーネルの改造不要 # echo ‘p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)‘ > kprobe_events Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved ¥ ¥ ¥ ¥ ¥ 23 Uprobes event (3.5~) • Kprobesのユーザ空間版 • アプリの好きな場所にイベントを埋め込める – アプリの改造不要 • イベントはftraceのバッファに統合される Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 24 Snapshot (3.9~) • トレースを止めずに、ある瞬間のバッファの スナップショットを取る機能 • 予備のトレースバッファを用意しておいて、 好きなタイミングで切り替える 1.error ⇒Snapshot 記録処理 2.swap Spare buffer 3. continue tracing Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 25 Snapshot • 使い方: “snapshot”ファイルに1を書き込む – スナップショットを取る(バッファも割り当てる) # echo 1 > snapshot – スナップショットを読む # cat snapshot – スナップショット・バッファを解放する # echo 0 > snapshot – バッファの割当て時間が気になる場合は、あらかじ め1を書いておいて、その後スナップショットを取る Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 26 Snapshot • その後、Stevenが色々強化してくれた – per_cpu snapshot – snapshot_raw Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 27 Multi-buffer (3.10~?) • トレースバッファを用途別に複数個使い分ける 機能 – 今までは1つのグローバル・バッファしか無かった global buffer CPU 0 CPU 1 CPU 2 CPU 3 + instance 1 instance N CPU 0 CPU 1 CPU 0 CPU 1 CPU 2 CPU 3 CPU 2 CPU 3 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 28 Multi-buffer • バッファの個数はmkdir/rmdirで動的に変更可能 # cd instances/ # mkdir buf_1 # ls buf_1 buffer_size_kb buffer_total_size_kb events free_buffer per_cpu set_event snapshot trace trace_clock trace_marker trace_options trace_pipe tracing_on Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 29 Multi-buffer • 今のところ、instances以下のバッファでは Trace Eventsのみ利用可能 – プラグイントレーサは利用不可 • 3.11でマルチトレーサが入る予定 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 30 Function-trigger • 特定の関数が呼ばれた時にアクションを起こす • アクションの例 – トレース全体のON/OFF – 特定のトレースイベントのON/OFF – スナップショットを取る – スタックトレースを取る 3.10~? # echo ‘vfs_read:snapshot:1’ ¥ > set_ftrace_filter Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 31 trace_clock • “trace_clock”ファイルに書き込むことで タイムスタンプの種類を変更できる – local – global – counter – x86-tsc (3.8~) – uptime (3.10~?) – perf (3.10~?) Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 32 まとめ • ftraceを使うと様々なトレースが可能 • debugfsベースのインタフェースで操作 • 多くの機能が追加されて更に便利に! Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 33 参考資料 • linux/Documentation/trace/ftrace.txt – 最近updateされたのでオススメ • Steven Rostedt, “Ftrace Linux Kernel Tracing”, LinuxCon Japan 2010 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 34 商標等 • Linuxは、Linus Torvalds氏の日本およびその 他の国における登録商標あるいは商標です。 Copyright (c) 2013 Hitachi LTD., Yokohama Research Lab. All rights reserved 35
© Copyright 2024 ExpyDoc