| TRACE-CMD-RECORD(1) | libtracefs Manual | TRACE-CMD-RECORD(1) |
نام (NAME)
trace-cmd-record - ضبط ردگیری از ردیاب داخلی لینوکس Ftrace
خلاصه دستور (SYNOPSIS)
trace-cmd record [OPTIONS] [command]
توضیحات (DESCRIPTION)
دستور trace-cmd(1) record ردیاب هستهٔ لینوکس Ftrace را برای ضبط افزونهها یا رویدادهای مشخصشدهای که در حین اجرای command رخ میدهند، تنظیم میکند. اگر دستوری مشخص نشود، ضبط تا زمانی که کاربر کلیدهای Ctrl-C را بزند ادامه خواهد یافت.
دستور record از ابزار trace-cmd ردیاب Ftrace را برای شروع ردگیری رویدادها یا افزونههای گوناگونی که در خط فرمان تعیین شدهاند، پیکربندی میکند. سپس تعدادی فرآیند ردگیری (یکی به ازای هر CPU) ایجاد میکند که ضبط دادهها را مستقیماً از بافر حلقوی هسته درون فایلهای موقت آغاز مینمایند. پس از تکمیل دستور (یا فشرده شدن کلیدهای Ctrl-C)، تمام فایلها درون یک فایل trace.dat ترکیب میشوند که بعداً قابل خواندن خواهد بود (به trace-cmd-report(1) مراجعه کنید).
گزینهها (OPTIONS)
-p tracer
-e event
مقدار 'event' همچنین میتواند حاوی الگوهای عمومی (glob expressions) باشد؛ بدین معنا که "*stat*" تمام رویدادها (یا زیرسیستمهایی) را که عبارت "stat" در نامشان وجود دارد انتخاب خواهد کرد.
کلیدواژهٔ 'all' میتواند برای فعالسازی همهٔ رویدادها استفاده شود.
-a
-T
<idle>-0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120]
<idle>-0 [003] 58549.289092: kernel_stack: <stack trace>
=> schedule (ffffffff814b260e)
=> cpu_idle (ffffffff8100a38c)
=> start_secondary (ffffffff814ab828)
--func-stack
-f filter
==, >=, <=, >, <, &, |, && و ||
موارد بالا معمولاً برای مقایسهٔ فیلدها بیخطر و قابل استفاده هستند.
--no-filter
-R trigger
برای اطلاعات بیشتر دربارهٔ راهاندازها، به Documentation/trace/events.txt در کد منبع هستهٔ لینوکس مراجعه کنید.
-v
نکته: گزینهٔ *-v* از شیوهٔ معکوس کردن تطابقها در grep(1) برگرفته شده است.
-P pid
-c
--user
-C clock
برای مشاهده ساعتهای در دسترس، دستور trace-cmd(1) list -C را اجرا کنید.
-o output-file
-l function-name
-g function-name
-n function-name
-d
-D
توجه داشته باشید که این کار ردگیری توابع را برای همه کاربران، از جمله کاربران خارج از ردیابهای ftrace (مانند stack_tracer، perf و غیره) غیرفعال میکند.
-O option
-s interval
واحد سنجش 'interval' میکروثانیه است. مقدار پیشفرض روی 1000 (۱ میلیثانیه) تنظیم شده است. این مدت زمانی است که هر فرایند ضبط پیش از بیدار شدن برای ثبت هرگونه داده جدید نوشتهشده در بافر حلقهای، میخوابد.
-r priority
-b size
--subbuf-size
نکته منفی زیربافرهای بزرگتر این است که یک «خواندن» (read) از بافر حلقهای، اندازه زیربافر را از بافر حلقهای بیرون کشیده و آن را با یک زیربافر جدید جایگزین میکند. این ممکن است اثر واقعی نداشته باشد، اما شاید رفتار را اندکی تغییر دهد. یا شاید هم تغییر ندهد!
-B buffer-name
پس از ذکر نام یک بافر، تمام رویدادهایی که پس از آن اضافه میشوند به آن بافر مرتبط خواهند شد. اگر هیچ بافری مشخص نشود، یا رویدادی قبل از نام یک بافر تعیین گردد، به بافر اصلی (سطح بالا یا toplevel) مرتبط خواهد شد.
trace-cmd record -e sched -B block -e block -B time -e timer sleep 1
دستور بالا تمام رویدادهای sched را در بافر اصلی فعال میکند. سپس یک نمونهٔ بافر به نام 'block' ایجاد کرده و تمام رویدادهای block را درون آن بافر فعال مینماید. یک نمونه بافر 'time' ایجاد شده و تمام رویدادهای timer برای آن رویداد فعال خواهند شد.
-m size
برای جلوگیری از اتمام فضای دیسک در اجراهای طولانی، از این گزینه استفاده کنید.
-M cpumask
trace-cmd record -p function -M c -B events13 -e all -M 5
اگر -M مشخص نشود، ماسک بدون تغییر باقی میماند. برای فعالسازی همهٔ CPUها، مقدار '-1' را ارسال کنید.
-k
نکته: معمولاً trace-cmd پروندهٔ "tracing_on" را به همان وضعیتی که پیش از فراخوانی آن بود برمیگرداند. این گزینه مقدار آن پرونده را روی صفر باقی میگذارد.
-K
-i
-N host:port
نکته: این گزینه با افزونههای ردیاب تأخیر (latency tracer) پشتیبانی نمیشود: wakeup, wakeup_rt, irqsoff, preemptoff and preemptirqsoff
-V cid:port
-t
-q | --quiet
--date
--max-graph-depth depth
--cmdlines-size size
--module module
'--module snd' معادل است با '-l :mod:snd'
'--module snd -l "*jack*"' معادل '-l "*jack*:mod:snd"' است
'--module snd -n "*"' معادل '-n :mod:snd' است
--proc-map
--profile
برای جزئیات بیشتر و مثالها به trace-cmd-profile(1) مراجعه کنید.
-G
-H event-hooks
trace-cmd record -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp trace-cmd report --profile
زمانهای hrtimer_expire_entry و hrtimer_expire_ext را پروفایل خواهد کرد.
برای قالب به trace-cmd-profile(1) مراجعه کنید.
-S
--temp directory
--ts-offset offset
--tsync-interval
--tsc2nsec
--stderr
--poll
--name
--verbose[=level]
مثال: فعالسازی تمام لاگهای critical، error و warning
trace-cmd record --verbose=warning
--file-version
--compression
'any' - انتخاب خودکار بهترین الگوریتم فشردهسازی موجود
'none' - فایل ردگیری را فشرده نمیکند
'name' - نام الگوریتمهای فشردهسازی مورد نظر. الگوریتمهای موجود را میتوان با این دستور فهرست کرد: trace-cmd list -c
--proxy vsocket
--daemonize پس از شروع ضبط، trace-cmd را در پسزمینه بهعنوان یک دیمن اجرا میکند. در طول ضبط، یک pidfile در /var/run/trace-cmd-record.pid حاوی pid مربوط به trace-cmd ایجاد میکند.
مثالها (EXAMPLES)
روش پایهای برای ردگیری همهٔ رویدادها:
# trace-cmd record -e all ls > /dev/null
# trace-cmd report
trace-cmd-13541 [003] 106260.693809: filemap_fault: address=0x128122 offset=0xce
trace-cmd-13543 [001] 106260.693809: kmalloc: call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERNEL|GFP_ZERO
ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0
ls-13545 [002] 106260.693818: sys_exit_write: 0x1
برای استفاده از ردگیر تابع (function tracer) بههمراه ردگیری sched switch:
# trace-cmd record -p function -e sched_switch ls > /dev/null
# trace-cmd report
ls-13587 [002] 106467.860310: function: hrtick_start_fair <-- pick_next_task_fair
ls-13587 [002] 106467.860313: sched_switch: prev_comm=trace-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=13583 next_prio=120
trace-cmd-13585 [001] 106467.860314: function: native_set_pte_at <-- __do_fault
trace-cmd-13586 [003] 106467.860314: function: up_read <-- do_page_fault
ls-13587 [002] 106467.860317: function: __phys_addr <-- schedule
trace-cmd-13585 [001] 106467.860318: function: _raw_spin_unlock <-- __do_fault
ls-13587 [002] 106467.860320: function: native_load_sp0 <-- __switch_to
trace-cmd-13586 [003] 106467.860322: function: down_read_trylock <-- do_page_fault
در اینجا یک روش مناسب برای یافتن وقفههایی با بیشترین تأخیر آمده است:
# trace-cmd record -p function_graph -e irq_handler_entry -l do_IRQ sleep 10
# trace-cmd report
<idle>-0 [000] 157412.933969: funcgraph_entry: | do_IRQ() {
<idle>-0 [000] 157412.933974: irq_handler_entry: irq=48 name=eth0
<idle>-0 [000] 157412.934004: funcgraph_exit: + 36.358 us | }
<idle>-0 [000] 157413.895004: funcgraph_entry: | do_IRQ() {
<idle>-0 [000] 157413.895011: irq_handler_entry: irq=48 name=eth0
<idle>-0 [000] 157413.895026: funcgraph_exit: + 24.014 us | }
<idle>-0 [000] 157415.891762: funcgraph_entry: | do_IRQ() {
<idle>-0 [000] 157415.891769: irq_handler_entry: irq=48 name=eth0
<idle>-0 [000] 157415.891784: funcgraph_exit: + 22.928 us | }
<idle>-0 [000] 157415.934869: funcgraph_entry: | do_IRQ() {
<idle>-0 [000] 157415.934874: irq_handler_entry: irq=48 name=eth0
<idle>-0 [000] 157415.934906: funcgraph_exit: + 37.512 us | }
<idle>-0 [000] 157417.888373: funcgraph_entry: | do_IRQ() {
<idle>-0 [000] 157417.888381: irq_handler_entry: irq=48 name=eth0
<idle>-0 [000] 157417.888398: funcgraph_exit: + 25.943 us | }
نمونهای از پروفایل:
# trace-cmd record --profile sleep 1
# trace-cmd report --profile --comm sleep
task: sleep-21611
Event: sched_switch:R (1) Total: 99442 Avg: 99442 Max: 99442 Min:99442
<stack> 1 total:99442 min:99442 max:99442 avg=99442
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> preempt_schedule (0xffffffff8150842e)
=> ___preempt_schedule (0xffffffff81273354)
=> cpu_stop_queue_work (0xffffffff810b03c5)
=> stop_one_cpu (0xffffffff810b063b)
=> sched_exec (0xffffffff8106136d)
=> do_execve_common.isra.27 (0xffffffff81148c89)
=> do_execve (0xffffffff811490b0)
=> SyS_execve (0xffffffff811492c4)
=> return_to_handler (0xffffffff8150e3c8)
=> stub_execve (0xffffffff8150c699)
Event: sched_switch:S (1) Total: 1000506680 Avg: 1000506680 Max: 1000506680 Min:1000506680
<stack> 1 total:1000506680 min:1000506680 max:1000506680 avg=1000506680
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> schedule (0xffffffff815084b8)
=> do_nanosleep (0xffffffff8150b22c)
=> hrtimer_nanosleep (0xffffffff8108d647)
=> SyS_nanosleep (0xffffffff8108d72c)
=> return_to_handler (0xffffffff8150e3c8)
=> tracesys_phase2 (0xffffffff8150c304)
Event: sched_wakeup:21611 (1) Total: 30326 Avg: 30326 Max: 30326 Min:30326
<stack> 1 total:30326 min:30326 max:30326 avg=30326
=> ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653)
=> ttwu_do_wakeup (0xffffffff810606eb)
=> ttwu_do_activate.constprop.124 (0xffffffff810607c8)
=> try_to_wake_up (0xffffffff8106340a)
نمونهای از استفاده از --daemonize همراه با ردگیری مهمان/میزبان:
$ sudo trace-cmd record --daemonize -p nop -e 'sched:sched_process_exec' -A guest -p nop -e net &&
> ping -c 1 10.20.1.2 &&
> sudo start-stop-daemon --stop --signal INT --retry 20 --pidfile /var/run/trace-cmd-record.pid &&
> sudo trace-cmd report -i trace.dat -i trace-guest.dat | head
Negotiated kvm time sync protocol with guest guest
Send SIGINT to pid 3071371 to stop recording
PING 10.20.1.2 (10.20.1.2) 56(84) bytes of data.
64 bytes from 10.20.1.2: icmp_seq=1 ttl=64 time=0.134 ms
--- 10.20.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.134/0.134/0.134/0.000 ms
CPU0 data recorded at offset=0x14f000
229 bytes in size (4096 uncompressed)
....
trace.dat: cpus=28
trace-guest.dat: cpus=1
trace.dat: ping-3071450 [013] 1196830.834258: sched_process_exec: filename=/bin/ping pid=3071450 old_pid=3071450
trace-guest.dat: <idle>-0 [000] 1196830.835990: napi_gro_receive_entry: dev=eth1 napi_id=0x2002 queue_mapping=1 skbaddr=0xffff95d051a5c400 vlan_tagged=0 vlan_proto=0x0000 vlan_tci=0x0000 protocol=0x0800 ip_summed=0 hash=0x00000000 l4_hash=0 len=84 data_len=0 truesize=768 mac_header_valid=1 mac_header=-14 nr_frags=0 gso_size=0 gso_type=0
trace-guest.dat: <idle>-0 [000] 1196830.835997: napi_gro_receive_exit: ret=3
trace-guest.dat: <idle>-0 [000] 1196830.835998: netif_receive_skb: dev=eth1 skbaddr=0xffff95d051a5c400x len=84
trace-guest.dat: <idle>-0 [000] 1196830.836021: net_dev_queue: dev=eth1 skbaddr=0xffff95d051a5c700x len=98
trace-guest.dat: <idle>-0 [000] 1196830.836024: net_dev_start_xmit: dev=eth1 queue_mapping=0 skbaddr=0xffff95d051a5c700 vlan_tagged=0 vlan_proto=0x0000 vlan_tci=0x0000 protocol=0x0800 ip_summed=0 len=98 data_len=0 network_offset=14 transport_offset_valid=1 transport_offset=34 tx_flags=0 gso_size=0 gso_segs=0 gso_type=0
trace-guest.dat: <idle>-0 [000] 1196830.836069: net_dev_xmit: dev=eth1 skbaddr=0xffff95d051a5c700 len=98 rc=0
trace.dat: sudo-3071451 [015] 1196830.838262: sched_process_exec: filename=/usr/bin/sudo pid=3071451 old_pid=3071451
trace-cmd(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd-profile(1)
نویسندگان (AUTHORS)
نوشتهشده توسط Steven Rostedt، <rostedt@goodmis.org[1]>
منابع (RESOURCES)
https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git
کپیرایت و تکثیر (COPYRIGHT)
حق نشر (C) 2010 متعلق به Red Hat, Inc. استفاده آزاد از این نرمافزار تحت شرایط «پروانه عمومی همگانی گنو» (GPL) مجاز است.
نکات (NOTES)
- 1.
- rostedt@goodmis.org
| 03/09/2026 | libtracefs |