
以åã®åºçç©ã§ã¯ãã«ãŒãã«ã®ãã¬ãŒã¹ãšãããã¡ã€ãªã³ã°ã®åé¡ã«ãã§ã«åãçµãã§ããŸãã ã«ãŒãã«ã¬ãã«ã§ã€ãã³ããåæããããã®å€ãã®å°çšããŒã«ããããŸãïŒ SystemTap ã Ktap ã Sysdig ã LTTNGãªã©ã ãããã®ããŒã«ã«é¢ããå€ãã®è©³çŽ°ãªèšäºãšãã¬ãŒãã³ã°è³æãå ¬éãããŠããŸãã
ã·ã¹ãã ã€ãã³ãã®è¿œè·¡ããããã°æ å ±ã®åä¿¡ãšåæãè¡ãããšãã§ããããã€ãã£ãããªLinuxã¡ã«ããºã ã«é¢ããæ å ±ã¯ã»ãšãã©ãããŸããã ä»æ¥ã®èšäºã§ãã®ãããã¯ãæ€èšããããšæããŸãã ã«ãŒãã«ã«è¿œå ãããæåã§ãããŸã§å¯äžã®ãã¬ãŒã¹ããŒã«ã§ããftraceã«ç¹ã«æ³šæãæããŸãã åºæ¬çãªæŠå¿µãå®çŸ©ããããšããå§ããŸãããã
ã«ãŒãã«ã®ãããã¡ã€ãªã³ã°ãšãã¬ãŒã¹
ã«ãŒãã«ãããã¡ã€ãªã³ã°ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããšã§ãã ãããã¡ã€ãªã³ã°ã䜿çšãããšãç¹å®ã®ããã°ã©ã ã§ããã©ãŒãã³ã¹ã®äœäžãçºçããå Žæãæ£ç¢ºã«ç¹å®ã§ããŸãã ç¹å¥ãªããã°ã©ã ã¯ãããã¡ã€ã«-ã€ãã³ãã®èŠçŽãçæããŸããããã«åºã¥ããŠãæãæéã®ããã£ãæ©èœãèŠã€ããããšãã§ããŸãã ãã ãããããã®ããã°ã©ã ã¯ãããã©ãŒãã³ã¹äœäžã®åå ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããã
ãããã¡ã€ãªã³ã°äžã«ç¹å®ã§ããªãç¹å®ã®æ¡ä»¶äžã§ã¯ãããã«ããã¯ãéåžžã«é »ç¹ã«çºçããŸãã ã€ãã³ããçºçããçç±ãç解ããã«ã¯ãã³ã³ããã¹ãã埩å ããå¿ èŠããããŸãã åæ§ã«ãã³ã³ããã¹ãã埩å ããã«ã¯ãã¬ãŒã¹ãå¿ èŠã§ãã
ãã¬ãŒã¹ãšã¯ã皌åäžã®ã·ã¹ãã å ã§äœãèµ·ãã£ãŠãããã«é¢ããæ å ±ãååŸããããšã§ãã ãã®ããã«ãç¹å¥ãªãœãããŠã§ã¢ããŒã«ã䜿çšãããŸãã ããŒãã¬ã³ãŒããŒãç°å¢ã®ãã¹ãŠã®é³ãèšé²ããããã«ãã·ã¹ãã å ã®ãã¹ãŠã®ã€ãã³ããèšé²ããŸãã
ãã¬ãŒãµãŒããã°ã©ã ã¯ãåã ã®ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã®äž¡æ¹ã§ã€ãã³ããåæã«è¿œè·¡ã§ããŸãã ãã¬ãŒã¹äžã«ååŸããæ å ±ã¯ãå€ãã®ã·ã¹ãã åé¡ã®èšºæãšè§£æ±ºã«åœ¹ç«ã¡ãŸãã
ãã¬ãŒã¹ã¯ããã®ã³ã°ãšæ¯èŒãããå ŽåããããŸãã 2ã€ã®æé ã«ã¯ç¢ºãã«é¡äŒŒç¹ããããŸãããéãããããŸãã
ãã¬ãŒã¹äžã«ãäœã¬ãã«ã§çºçããã€ãã³ãã«é¢ããæ å ±ãèšé²ãããŸãã ãã®æ°ã¯æ°çŸãæ°åã§ãã ãã°ã«ã¯ãã·ã¹ãã ã«ãã°ã€ã³ãããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã®æäœã®ãšã©ãŒãããŒã¿ããŒã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ãªã©ãããŸãé »ç¹ã«çºçããªãé«ã¬ãã«ã®ã€ãã³ãã«é¢ããæ å ±ãå«ãŸããŠããŸãã
ãã°ãšåæ§ã«ããã¬ãŒã¹ããŒã¿ãå«ããã¡ã€ã«ã¯ãã¯ãŒã¯ã·ãŒããããèªã¿åãããšãã§ããŸãã ãã ããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®æäœã«é¢é£ããæ å ±ããããããæœåºããæ¹ãã¯ããã«èå³æ·±ãæçšã§ãã ãã¹ãŠã®ãã¬ãŒãµããã°ã©ã ã«ã¯ã察å¿ããæ©èœããããŸãã
Linuxã«ãŒãã«ã«ã¯ãã«ãŒãã«ãã¬ãŒã¹ãšãããã¡ã€ãªã³ã°ã®æé ãå®è£ ãã3ã€ã®äž»èŠãªã¡ã«ããºã ããããŸãã
- ãã¬ãŒã¹ãã€ã³ã-ã³ãŒãã®éçã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãéããŠæ©èœããã¡ã«ããºã ã
- kprobes-ã«ãŒãã«ã³ãŒãã®å®è¡ãã©ãã§ãäžæããç¬èªã®ãã³ãã©ãŒãåŒã³åºããå¿ èŠãªãã¹ãŠã®æäœãå®äºãããæ»ãããšãã§ããåçãã¬ãŒã¹ã¡ã«ããºã ã
- perf_events-PMUïŒããã©ãŒãã³ã¹ã¢ãã¿ãªã³ã°ãŠãããïŒã¢ã¯ã»ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã
ããããã¹ãŠã®ã¡ã«ããºã ã®æ©èœã«ã€ããŠã¯è©³ãã説æããŸããã èå³ã®ããèªè ã¯ãNTC MetroTech瀟ã®èšäºãšBrendan Greggã®ããã°ãåç §ããŠãã ãã ã
ftraceã䜿çšãããšããããã®ã¡ã«ããºã ãšå¯Ÿè©±ãããŠãŒã¶ãŒç©ºéã§ãããã°ããŒã¿ãååŸã§ããŸãã ããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã ãã¹ãŠã®ãµã³ãã«ã³ãã³ãã¯ãã«ãŒãã«ããŒãžã§ã³3.13.0-24ã®Ubuntu 14.04çšã«æäŸãããŠããŸãã
FtraceïŒäžè¬æ å ±
ftraceãšããååã¯ãFunction Trace-function tracingã®ç¥ã§ãã ãã ãããã®ããŒã«ã®æ©èœã¯ã¯ããã«åºãããã®å©ãã«ãããã³ã³ããã¹ãã¹ã€ããã®è¿œè·¡ãå²ã蟌ã¿ã®åŠçæéã®æž¬å®ãåªå 床ã®é«ãã¿ã¹ã¯ã®ã¢ã¯ãã£ãåæéã®èšç®ãªã©ãã§ããŸãã
Ftraceã¯Stephen Rostedtã«ãã£ãŠéçºããã2008幎ã«ããŒãžã§ã³2.6.27ããã«ãŒãã«ã«è¿œå ãããŸããã ããã¯ãããŒã¿ãæžã蟌ãããã®ãããã°ãªã³ã°ãããã¡ãæäŸãããã¬ãŒã ã¯ãŒã¯ã§ãã ãã®ããŒã¿ã¯ãã«ãŒãã«ã«çµã¿èŸŒãŸããŠãããã¬ãŒãµãŒããã°ã©ã ã«ãã£ãŠåéãããŸãã
Ftraceã¯ãã»ãšãã©ã®ææ°ã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ããã©ã«ãã§ããŠã³ããããŠããdebugfsãã¡ã€ã«ã·ã¹ãã ã«åºã¥ããŠå®è¡ãããŸãã ftraceãéå§ããã«ã¯ãsys / kernel / debug / tracingãã£ã¬ã¯ããªã«ç§»åããã ãã§ãïŒrootãŠãŒã¶ãŒã®ã¿ã䜿çšã§ããŸãïŒã
# cd /sys/kernel/debug/tracing
ãã®äžã«å«ãŸãããã¹ãŠã®ãã¡ã€ã«ãšãµããã£ã¬ã¯ããªã«ã€ããŠã¯è©³ãã説æããŸãããããã¯ãã§ã«å ¬åŒããã¥ã¡ã³ãã§è¡ãããŠããŸã ã æ€èšã®ã³ã³ããã¹ãã§é¢å¿ã®ãããã®ã®ã¿ãç°¡åã«èª¬æããŸãã
- available_tracers-å©çšå¯èœãªãã¬ãŒãµãŒããã°ã©ã ã
current_tracer-çŸåšã¢ã¯ãã£ããªãã¬ãŒãµããã°ã©ã ã - tracing_on-ãªã³ã°ãããã¡ã§ã®ããŒã¿èšé²ãæå¹ãŸãã¯ç¡å¹ã«ãããµãŒãã¹ãã¡ã€ã«ïŒèšé²ãæå¹ã«ããã«ã¯ããã®ãã¡ã€ã«ã«1ãæžã蟌ã¿ãç¡å¹ã«ããã«ã¯0ïŒã
- ãã¬ãŒã¹-ãã¬ãŒã¹ããŒã¿ã人éãèªãã圢åŒã§ä¿åãããŠãããã¡ã€ã«ã
å©çšå¯èœãªãã¬ãŒãµãŒ
ã³ãã³ãã䜿çšããŠãå©çšå¯èœãªãã¬ãŒãµãŒã®ãªã¹ãã衚瀺ã§ããŸã
root@andrei:/sys/kernel/debug/tracing#: cat available_tracers blk mmiotrace function_graph wakeup_rt wakeup function nop
åãã¬ãŒãµãŒã®ç°¡åãªèª¬æã次ã«ç€ºããŸãã
- function-åŒæ°ãåãåãå¯èœæ§ã®ãªãã«ãŒãã«åŒã³åºãé¢æ°ã®ãã¬ãŒãµãŒã
- function_graph-ãµãã³ãŒã«ã䜿çšããã«ãŒãã«åŒã³åºãé¢æ°ã®ãã¬ãŒãµãŒã
- blk-ãããã¯ããã€ã¹ãžã®å ¥åºåã«é¢é£ããåŒã³åºããšã€ãã³ãã®ãã¬ãŒãµãŒã ãã§ã«æžããã®ã¯blktraceãŠãŒãã£ãªãã£ã§äœ¿çšããã人ã§ãã
- mmiotraceã¯ãã¡ã¢ãªI / Oã®ãã¬ãŒãµãŒã§ãã
- nopã¯æãåçŽãªãã¬ãŒãµãŒã§ããããã®ååã瀺ãããã«ãäœãããŸããïŒãã ããç¶æ³ã«ãã£ãŠã¯ãåŸã§èª¬æããŸãïŒã
ãã¬ãŒãµãŒæ©èœ
é¢æ°tracerããftraceã®çŽ¹ä»ãå§ããŸãã ãã®ãããªãã¹ãã¹ã¯ãªããã®ææã§æ€èšããŸãã
#!/bin/sh dir=/sys/kernel/debug/tracing sysctl kernel.ftrace_enabled=1 echo function > ${dir}/current_tracer echo 1 > ${dir}/tracing_on sleep 1 echo 0 > ${dir}/tracing_on less ${dir}/trace
å°äžå®€ã¯éåžžã«ã·ã³ãã«ã§äžè¬çã«ç解ã§ããŸããã泚æãã䟡å€ãããç¬éããããŸãã
sysctl ftrace.enabled = 1ã³ãã³ãã¯ãé¢æ°ã®ãã¬ãŒã¹ãæå¹ã«ããŸãã 次ã«ãcurrent_tracerãã¡ã€ã«ã«ååãæžã蟌ãã§ãçŸåšã®ãã¬ãŒãµãŒãã€ã³ã¹ããŒã«ããŸãã
ãã®åŸãtracing_onãã¡ã€ã«ã«1ãæžã蟌ãããšã«ããããªã³ã°ãããã¡ãŒã®æŽæ°ãã¢ã¯ãã£ãã«ããŸãã æ§æã®éèŠãªæ©èœïŒ1ãšsign>ã®éã«ã¯ã¹ããŒã¹ãå¿ èŠã§ãïŒecho1> tracing_onã®åœ¢åŒã®ã³ãã³ãã¯æ©èœããŸããã æåéã1è¡ã§ç¡å¹ã«ããŸãïŒæ³šïŒtracing_onãã¡ã€ã«ã«0ãæžã蟌ãã å Žåããªã³ã°ãããã¡ã¯ã¯ãªã¢ãããŸãã; ftraceã¯ç¡å¹ã«ãªããŸããïŒã
ãªããããè¡ãã®ã§ããïŒ 2ã€ã®ãšã³ãŒã³ãã³ãã®éã«ã¯sleep 1ã³ãã³ããããããããã¡ãŒã®æŽæ°ãæå¹ã«ããŠããã®ã³ãã³ããå®è¡ããããã«ç¡å¹ã«ããŸãã ãã®ããããã¬ãŒã¹ã«ã¯ããã®ã³ãã³ãã®å®è¡äžã«çºçãããã¹ãŠã®ã·ã¹ãã ã³ãŒã«ã«é¢ããæ å ±ãå«ãŸããŸãã
ã¹ã¯ãªããã®æåŸã®è¡ã§ã¯ãã³ã³ãœãŒã«ã«ãã¬ãŒã¹ããŒã¿ã衚瀺ããã³ãã³ããæå®ããŸãã
ãã®ã¹ã¯ãªãããå®è¡ããçµæã次ã®åºåã衚瀺ãããŸãïŒå°ããªãã©ã°ã¡ã³ãã®ã¿ã瀺ããŸãïŒã
# tracer: function # # entries-in-buffer/entries-written: 29571/29571 #P:2 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | trace.sh-1295 [000] .... 90.502874: mutex_unlock <-rb_simple_write trace.sh-1295 [000] .... 90.502875: __fsnotify_parent <-vfs_write trace.sh-1295 [000] .... 90.502876: fsnotify <-vfs_write trace.sh-1295 [000] .... 90.502876: __srcu_read_lock <-fsnotify trace.sh-1295 [000] .... 90.502876: __srcu_read_unlock <-fsnotify trace.sh-1295 [000] .... 90.502877: __sb_end_write <-vfs_write trace.sh-1295 [000] .... 90.502877: syscall_trace_leave <-int_check_syscall_exit_work trace.sh-1295 [000] .... 90.502878: context_tracking_user_exit <-syscall_trace_leave trace.sh-1295 [000] .... 90.502878: context_tracking_user_enter <-syscall_trace_leave trace.sh-1295 [000] d... 90.502878: vtime_user_enter <-context_tracking_user_enter trace.sh-1295 [000] d... 90.502878: _raw_spin_lock <-vtime_user_enter trace.sh-1295 [000] d... 90.502878: __vtime_account_system <-vtime_user_enter trace.sh-1295 [000] d... 90.502878: get_vtime_delta <-__vtime_account_system trace.sh-1295 [000] d... 90.502879: account_system_time <-__vtime_account_system trace.sh-1295 [000] d... 90.502879: cpuacct_account_field <-account_system_time trace.sh-1295 [000] d... 90.502879: acct_account_cputime <-account_system_time trace.sh-1295 [000] d... 90.502879: __acct_update_integrals <-acct_account_cputime
åºåã¯ããããã¡å ã®ã€ãã³ãã¬ã³ãŒãã®æ°ïŒãããã¡å ã®ãšã³ããªïŒããã³èšé²ãããã€ãã³ãã®ç·æ°ïŒæžã蟌ãŸãããšã³ããªïŒã«é¢ããæ å ±ããå§ãŸããŸãã ãããã®2æ¡ã®éãã¯ããããã¡ã®å å¡«äžã«å€±ãããã€ãã³ãã®æ°ã§ãïŒãã®å Žåã倱ãããã€ãã³ãã¯ãããŸããïŒã
次ã¯ã次ã®æ å ±ãå«ãé¢æ°ã®ãªã¹ãã§ãã
- ããã»ã¹èå¥åïŒPIDïŒ;
- ãã¬ãŒã¹ãå®è¡ãããããã»ããµã³ã¢ã®çªå·ïŒCPUïŒïŒã
- ã¿ã€ã ã¹ã¿ã³ãïŒTIMESTAMPãé¢æ°ãå ¥åãããæå»ã瀺ããŸãïŒ;
- ãã¬ãŒã¹ãããé¢æ°ã®ååãšãããåŒã³åºãã芪é¢æ°ã®ååïŒFUNCTIONïŒ; ããšãã°ãåºåã®æåã®è¡ã§ã¯ãmutex-unlocké¢æ°ãrb_simple_writeé¢æ°ã«ãã£ãŠåŒã³åºãããŸãã
Function_graphãã¬ãŒãµãŒ
function_graphãã¬ãŒãµãŒã¯ãfunctionãšãŸã£ããåãããã«æ©èœããŸãããé¢æ°ããã詳现ã«è¿œè·¡ããŸããåé¢æ°ã«ã€ããŠãå ¥å£ç¹ãšåºå£ç¹ã瀺ããŸãã ãã®ãã¬ãŒãµãŒã䜿çšãããšããµãã³ãŒã«ã§é¢æ°ã远跡ããåé¢æ°ã®å®è¡æéã枬å®ã§ããŸãã
åã®äŸã§äœ¿çšããã¹ã¯ãªãããç·šéããŸãã
#!/bin/sh dir=/sys/kernel/debug/tracing sysctl kernel.ftrace_enabled=1 echo function_graph > ${dir}/current_tracer echo 1 > ${dir}/tracing_on sleep 1 echo 0 > ${dir}/tracing_on less ${dir}/trace
ãã®ã¹ã¯ãªãããå®è¡ããçµæã次ã®åºåãåŸãããŸãã
# tracer: function_graph # # CPU DURATION FUNCTION CALLS # | | | | | | | 0) 0.120 us | } /* resched_task */ 0) 1.877 us | } /* check_preempt_curr */ 0) 4.264 us | } /* ttwu_do_wakeup */ 0) + 29.053 us | } /* ttwu_do_activate.constprop.74 */ 0) 0.091 us | _raw_spin_unlock(); 0) 0.260 us | ttwu_stat(); 0) 0.133 us | _raw_spin_unlock_irqrestore(); 0) + 37.785 us | } /* try_to_wake_up */ 0) + 38.478 us | } /* default_wake_function */ 0) + 39.203 us | } /* pollwake */ 0) + 40.793 us | } /* __wake_up_common */ 0) 0.104 us | _raw_spin_unlock_irqrestore(); 0) + 42.920 us | } /* __wake_up_sync_key */ 0) + 44.160 us | } /* sock_def_readable */ 0) ! 192.850 us | } /* tcp_rcv_established */ 0) ! 197.445 us | } /* tcp_v4_do_rcv */ 0) 0.113 us | _raw_spin_unlock(); 0) ! 205.655 us | } /* tcp_v4_rcv */ 0) ! 208.154 us | } /* ip_local_deliver_finish */
DURATIONåã¯ãæ©èœã®å®äºã«ããã£ãæéã瀺ããŠããŸãã +ããã³ïŒããŒã¯ã®ä»ããã¢ã€ãã ã«ã¯ç¹ã«æ³šæãæã£ãŠãã ããã +èšå·ã¯ãé¢æ°ã10ãã€ã¯ãç§ä»¥äžããããæå笊ã100以äžããã£ãããšãæå³ããŸãã
é¢æ°åŒã³åºãã«é¢ããæ å ±ãå«ãFUNCTION_CALLSåã
åé¢æ°ã®éå§ãšçµäºã¯ãCã§æ £äŸãšãªã£ãŠããããã«ããã®äžã«ç€ºãããŠããŸããé¢æ°ã®å é ã«äžæ¬åŒ§ãæåŸã«ãã1ã€ããããŸãã ã°ã©ãã®ãªãŒãã§ãããä»ã®é¢æ°ãåŒã³åºããªãé¢æ°ã¯ãã»ãã³ãã³ïŒ;ïŒã§ç€ºãããŸãã
é¢æ°ã®ãã£ã«ã¿ãŒ
ftraceã®åºåã¯éåžžã«å€§ãããªãããšããããå¿ èŠãªæ å ±ãèŠã€ããã®ã¯éåžžã«å°é£ã§ãã ãã£ã«ã¿ãŒã䜿çšããŠæ€çŽ¢ãç°¡çŽ åã§ããŸããåºåã«ã¯ããã¹ãŠã®æ©èœã«é¢ããæ å ±ã¯å«ãŸããŸããããæ¬åœã«é¢å¿ã®ããæ©èœã«é¢ããæ å ±ã®ã¿ãå«ãŸããŸãã ãããè¡ãã«ã¯ãå¿ èŠãªé¢æ°ã®ååãset_ftrace_filterãã¡ã€ã«ã«æžã蟌ãã ãã§ãã次ã«äŸã瀺ããŸãã
root@andrei:/sys/kernel/debug/tracing# echo kfree > set_ftrace_filter
ãã£ã«ã¿ãŒãç¡å¹ã«ããã«ã¯ãåããã¡ã€ã«ã«ç©ºã®è¡ãæžã蟌ãå¿ èŠããããŸãã
root@andrei:/sys/kernel/debug/tracing# echo > set_ftrace_filter
ã³ãã³ãã®çµæãšããŠ
root@andrei:/sys/kernel/debug/tracing# echo kfree > set_ftrace_notrace
æ£å察ã®çµæãåŸãããŸããkfreeïŒïŒãé€ããã¹ãŠã®é¢æ°ã«é¢ããæ å ±ãåºåãããŸãã
å¥ã®äŸ¿å©ãªãªãã·ã§ã³ã¯set_ftrace_pidã§ãã æå®ãããããã»ã¹ã®å®è¡äžã«åŒã³åºãããé¢æ°ããã¬ãŒã¹ããããšãç®çãšããŠããŸãã
ftraceã®ãã£ã«ã¿ãªã³ã°ãªãã·ã§ã³ã¯ã¯ããã«åºãã§ãã LWN.netã®Stephen Rostedtã®èšäºã§ããããã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ã€ãã³ããã¬ãŒã¹
ãã¬ãŒã¹ãã€ã³ãã¡ã«ããºã ã«ã€ããŠã¯æ¢ã«èª¬æããŸããã 翻蚳ã®ãã¬ãŒã¹ãã€ã³ããšããèšèã¯ããã¬ãŒã¹ãã€ã³ãããæå³ããŸãã ãã¬ãŒã¹ãã€ã³ãã¯ãç¹å®ã®ã·ã¹ãã ã€ãã³ããèšé²ããã³ãŒããžã®ç¹å¥ãªæ¿å ¥ã§ãã ãã¬ãŒã¹ãã€ã³ãã¯ãã¢ã¯ãã£ãïŒæ€èšŒãå²ãåœãŠãããŠããããšãæå³ããïŒãŸãã¯éã¢ã¯ãã£ãïŒæ€èšŒãå²ãåœãŠãããŠããªãïŒã«ãªããŸãã
éã¢ã¯ãã£ããªãã¬ãŒã¹ãã€ã³ãã¯ãã·ã¹ãã ã®åäœã«åœ±é¿ãäžããŸããã ã€ã³ã¹ãã«ã¡ã³ãåãããé¢æ°ã®æåŸã«ãã¬ãŒã¹é¢æ°ãåŒã³åºãããã«æ°ãã€ããè¿œå ããã ãã§ãªããããŒã¿æ§é ãå¥ã®ã»ã¯ã·ã§ã³ã«è¿œå ããŸãã
ãã¬ãŒã¹ãã€ã³ããã¢ã¯ãã£ããªå Žåã察å¿ããã³ãŒããã©ã°ã¡ã³ããå®è¡ããããšããã¬ãŒã¹é¢æ°ãåŒã³åºãããŸãã ãã¬ãŒã¹ããŒã¿ã¯ãããã°ãªã³ã°ãããã¡ã«æžã蟌ãŸããŸãã
ãã¬ãŒã¹ãã€ã³ãã¯ãã³ãŒãã®ä»»æã®å Žæã«æ¿å ¥ã§ããŸãã ãããã¯ãã§ã«å€ãã®æ žæ©èœã®ã³ãŒãã«ååšããŠããŸãã ããšãã°ãkmem_cache_allocé¢æ°ïŒ ããããååŸïŒãèããŠãã ããïŒ
{ void *ret = slab_alloc(cachep, flags, _RET_IP_); trace_kmem_cache_alloc(_RET_IP_, ret, cachep->object_size, cachep->size, flags); return ret; }
trace_kmem_cache_allocè¡ã«æ³šæããŠãã ãã -ããããŸãã«ãã¬ãŒã¹ãã€ã³ãã§ãã ãã®ãããªäŸã®æ°ã¯ãä»ã®ã«ãŒãã«é¢æ°ã®ãœãŒã¹ã³ãŒããåç §ããããšã§ä¹ç®ã§ããŸãã
Linuxã«ãŒãã«ã«ã¯ããŠãŒã¶ãŒç©ºéãããã¬ãŒã¹ãã€ã³ããæäœããããã«äœ¿çšã§ããç¹å¥ãªAPIããããŸãã / sys / kernel / debug / tracingãã£ã¬ã¯ããªã«ã¯eventsãµããã£ã¬ã¯ããªãå«ãŸãã远跡ã«äœ¿çšã§ããã·ã¹ãã ã€ãã³ããä¿åãããŸãã ãã®ã³ã³ããã¹ãã§ã®ã·ã¹ãã ã€ãã³ãã¯ãã«ãŒãã«ã«å«ãŸãããã¬ãŒã¹ãã€ã³ãã«ãããŸããã
次ã®ã³ãã³ãã䜿çšããŠããªã¹ãã衚瀺ã§ããŸãã
root@andrei:/sys/kernel/debug/tracing# cat available_events
é·ããªã¹ããã³ã³ãœãŒã«ã«è¡šç€ºãããŸãããããã¯é²èŠ§ããã«ã¯ããªãäžäŸ¿ã§ãã 次ã®ãããªããæ§é åããã圢åŒã§åããªã¹ãã衚瀺ã§ããŸãã
root@andrei:/sys/kernel/debug/tracing# ls events
ã€ãã³ããã©ããã³ã°ã«é²ãåã«ããªã³ã°ãããã¡ã§ã€ãã³ãã®èšé²ãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã
root@andrei:/sys/kernel/debug/tracing# cat tracing_on
ãã®ã³ãã³ããå®è¡ããåŸãæ°å0ãã³ã³ãœãŒã«ã«è¡šç€ºãããå Žåã¯ã次ãå®è¡ããŸãã
root@andrei:/sys/kernel/debug/tracing# echo 1 > tracing_on
ååã®èšäºã§ãchrootïŒïŒã·ã¹ãã ã³ãŒã«ã«ã€ããŠæžããŸãã-ãã®ã·ã¹ãã ã³ãŒã«ãžã®å ¥ãå£ãç£èŠããŸãã ãã¬ãŒãµãŒãšããŠnopãéžæããŸããfunctionãšfunction_graphã¯ãé¢å¿ã®ããã€ãã³ãã«é¢é£ããªãæ å ±ãå«ãã倧éã®æ å ±ãæžã蟌ã¿ãŸãã
root@andrei:/sys/kernel/debug/tracing# echo nop > current_tracer
ã·ã¹ãã ã³ãŒã«ã«é¢é£ãããã¹ãŠã®ã€ãã³ãã¯ãsyscallsãã£ã¬ã¯ããªã«ä¿åãããŸãã 次ã«ãããŸããŸãªã·ã¹ãã ã³ãŒã«ãéå§ããã³çµäºããããã®ãã£ã¬ã¯ããªãæ ŒçŽããŸãã ã€ããŒãã«ãã¡ã€ã«ã«1ãæžã蟌ãããšã§ãå¿ èŠãªãã¬ãŒã¹ãã€ã³ããã¢ã¯ãã£ãã«ããŸãã
root@andrei:/sys/kernel/debug/tracing# echo 1 > events/syscalls/sys_enter_chroot/enable
次ã«ãchrootã³ãã³ãã䜿çšããŠåé¢ãã¡ã€ã«ã·ã¹ãã ãäœæããŸãïŒè©³çŽ°ã«ã€ããŠã¯ã åã®æçš¿ãåç §ããŠãã ããïŒã é¢å¿ã®ããã³ãã³ããå®è¡ããåŸããã¬ãŒã¹ããªãã«ããŠãäžå¿ èŠã§ç¡é¢ä¿ãªã€ãã³ãã«é¢ããæ å ±ãåºåã«å ¥ããªãããã«ããŸãã
root@andrei:/sys/kernel/debug/tracing# echo 0 > tracing_on
次ã«ããªã³ã°ãããã¡ãŒã®å 容ã衚瀺ããŸãã åºåã®æåŸã«ãé¢å¿ã®ããã·ã¹ãã ã³ãŒã«ã«é¢ããæ å ±ãå«ãŸããŸãïŒå°ããªãã©ã°ã¡ã³ãã瀺ããŸãïŒã
root@andrei:/sys/kernel/debug/tracing# at trace ...... chroot-11321 [000] .... 4606.265208: sys_chroot(filename: 7fff785ae8c2) chroot-11325 [000] .... 4691.677767: sys_chroot(filename: 7fff242308cc) bash-11338 [000] .... 4746.971300: sys_chroot(filename: 7fff1efca8cc) bash-11351 [000] .... 5379.020609: sys_chroot(filename: 7fffbf9918cc)
ã€ãã³ããã©ããã³ã°èšå®ã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
ãããã«
ãã®èšäºã§ã¯ãftraceæ©èœã®äžè¬çãªæŠèŠãæäŸããŸããã ã³ã¡ã³ããè¿œå ã¯å€§æè¿ã§ãã ãããã¯ãããã«æ·±ãæãäžãããå Žåã¯ã次ã®ãœãŒã¹ã«ç²Ÿéããããšããå§ãããŸãã
- https://www.kernel.org/doc/Documentation/trace/tracepoints.txt-ãã¬ãŒã¹ãã€ã³ãã®ã¡ã«ããºã ã®è©³çŽ°ãªèª¬æã
- https://www.kernel.org/doc/Documentation/trace/events.txt-Linuxã§ã·ã¹ãã ã€ãã³ãããã¬ãŒã¹ããããã®ã¬ã€ãã
- https://www.kernel.org/doc/Documentation/trace/ftrace.txt-å ¬åŒã®ftraceããã¥ã¡ã³ãã
- https://lttng.org/files/thesis/desnoyers-dissertation-2009-12-v27.pdf-ã«ãŒãã«ã®ãã¬ãŒã¹ãšãããã¡ã€ãªã³ã°ã«é¢ããMathieu DenoirïŒãã¬ãŒã¹ãã€ã³ãã®ã¡ã«ããºã ã®äœæè ããã³LTTNGã®äœæè ïŒã«ããè«æã
- https://lwn.net/Articles/370423/-ftraceæ©èœã«é¢ããStephen Rodstedtã®èšäºã
- http://alex.dzyoba.com/linux/profiling-ftrace.html-å®çšçãªã±ãŒã¹ã¹ã¿ãã£ãå«ãftraceã®ã¬ãã¥ãŒèšäºã
- http://panda-nox.livejournal.com/2235.html-ãã·ã¢èªã§ã®ftraceã«é¢ããå¯äžã®è©³çŽ°ãªåºçç©ã
äœããã®çç±ã§ããã«ã³ã¡ã³ããæ®ããªãå Žåã¯ã ããã°ã«æåŸ ããŸãã