| PERF-TRACE(1) | perf Manual | PERF-TRACE(1) |
نام (NAME)
perf-trace - ابزاری الهامگرفته از strace
خلاصه دستور (SYNOPSIS)
perf trace perf trace record
توضیحات (DESCRIPTION)
این دستور رویدادهای مرتبط با هدف را نمایش میدهد؛ در ابتدا فراخوانیهای سیستمی (syscalls)، اما سایر رویدادهای سیستم مانند خطاهای صفحه (pagefaults)، رویدادهای چرخه حیات وظایف، رویدادهای زمانبندی و غیره را نیز شامل میشود.
این ابزار علاوه بر کار با فایلهای perf.data مانند سایر ابزارهای perf، در حالت زنده (live mode) نیز کار میکند. فایلها را میتوان با استفاده از دستور perf record ایجاد کرد، اما نشست باید شامل رویدادهای raw_syscalls باشد (-e raw_syscalls:*). همچنین میتوان از perf trace record به عنوان یک میانبر برای گنجاندن خودکار رویدادهای raw_syscalls هنگام نوشتن رویدادها در فایل استفاده کرد.
گزینههای زیر برای perf trace اعمال میشوند؛ گزینههای مربوط به perf trace record در صفحه راهنمای perf record یافت میشوند.
گزینهها (OPTIONS)
-a, --all-cpus
-e, --expr, --event
--filter=<filter>
-D msecs, --delay msecs
-o, --output=
-p, --pid=
-t, --tid=
-u, --uid=
-G, --cgroup
برای تنظیم cgroupها در دایرکتوری /sys/fs/cgroup/perf_event جستجو کنید، سپس بخش /sys/fs/cgroup/perf_event/ را حذف کرده و امتحان کنید:
perf trace -G A -e sched:*switch
تمام raw_syscalls:sys_{enter,exit}، pgfault، vfs_getname و غیره
_و_ sched:sched_switch را روی cgroup 'A' تنظیم میکند، در حالی که:
perf trace -e sched:*switch -G A
تنها رویداد sched:sched_switch را روی cgroup 'A' تنظیم خواهد کرد، تمام
رویدادهای دیگر (raw_syscalls:sys_{enter,exit} و غیره) «بدون» cgroup باقی
میمانند (روی cgroup ریشه، در سطح کل سیستم و غیره).
چندین cgroup:
perf trace -G A -e sched:*switch -G B
موارد syscall به cgroup 'A' و sched:sched_switch به cgroup 'B' اختصاص مییابند.
--filter-pids=
--no-inherit
-m, --mmap-pages=
-C, --cpu
--duration
--sched
--failure
-i, --input
-T, --time
--comm
-s, --summary
-S, --with-summary
--errno-summary
--summary-mode=mode
--tool_stats
-f, --force
-F=[all|min|maj], --pf=[all|min|maj]
--syscalls
--call-graph [mode,type,min[,limit],order[,key][,branch]]
استفاده از این گزینه، برای کاربر root، بر اساس sysctl مربوط به kernel.perf_event_mlock_kb، مقدار --mmap-pages را به ۴ برابر حداکثر برای کاربران غیر root افزایش میدهد. این کار تنها زمانی انجام میشود که کاربر مقداری برای --mmap-pages تعیین نکرده باشد.
--kernel-syscall-graph
--max-events=N
--switch-on EVENT_NAME
--switch-off EVENT_NAME
--show-on-off-events
--show-cpu
--max-stack
در صورت عدم وجود --call-graph در خط فرمان، روی سیستمهایی که DWARF unwinding در آنها تعبیه شده است، بر '--call-graph dwarf' دلالت دارد.
پیشفرض: /proc/sys/kernel/perf_event_max_stack در صورت وجود برای
نشستهای زنده (بدون --input/-i)، در غیر این صورت 127.
--min-stack
--print-sample
--proc-map-timeout
--sort-events
--libtraceevent_print
--force-btf
--bpf-summary
--max-summary=N
خطاهای صفحه (PAGEFAULTS)
هنگام ردگیری خطاهای صفحه، قالب ردگیری به شرح زیر است:
<min|maj>fault [<ip.symbol>+<ip.offset>] ⇒ <addr.dso@addr.offset[1]> (<map type><addr level>).
برای تفکیک نمادها ممکن است نیاز به نصب نمادهای اشکالزدایی داشته باشید.
لطفاً توجه داشته باشید که مقدار مدت زمان در حال حاضر همواره ۰ است و زمان واقعی صرف شده برای رسیدگی به خطا را نشان نمیدهد!
هنگامی که --verbose مشخص شود، perf trace تلاش میکند تا تمام اطلاعات موجود را برای هر دو آدرس IP و آدرس خطا در قالب dso@symbol[2]+offset چاپ کند..SH "مثالها (EXAMPLES)"
ردیابی تنها خطاهای صفحه عمده (major pagefaults):
$ perf trace --no-syscalls -F
ردیابی فراخوانهای سیستمی، خطاهای صفحه عمده و جزئی:
$ perf trace -F all
1416.547 ( 0.000 ms): python/20235 majfault [CRYPTO_push_info_+0x0] => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0@0x61be0 (x.)
همانطور که مشاهده میکنید، یک خطای صفحه عمده در فرایند python رخ داده است، از روتین CRYPTO_push_info_ که در نقطهای درون libcrypto.so دچار خطا شد.
ردیابی ۴ فراخوان سیستمی نخست open، openat یا open_by_handle_at (در آینده ممکن است فراخوانهای سیستمی بیشتری با این الگو مطابقت پیدا کنند):
$ perf trace -e open* --max-events 4 [root@jouet perf]# trace -e open* --max-events 4 2272.992 ( 0.037 ms): gnome-shell/1370 openat(dfd: CWD, filename: /proc/self/stat) = 31 2277.481 ( 0.139 ms): gnome-shell/3039 openat(dfd: CWD, filename: /proc/self/stat) = 65 3026.398 ( 0.076 ms): gnome-shell/3039 openat(dfd: CWD, filename: /proc/self/stat) = 65 4294.665 ( 0.015 ms): sed/15879 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC) = 3 $
ردیابی نخستین خطای صفحه جزئی هنگام اجرای یک بار کاری:
# perf trace -F min --max-stack=7 --max-events 1 sleep 1
0.000 ( 0.000 ms): sleep/18006 minfault [__clear_user+0x1a] => 0x5626efa56080 (?k)
__clear_user ([kernel.kallsyms])
load_elf_binary ([kernel.kallsyms])
search_binary_handler ([kernel.kallsyms])
__do_execve_file.isra.33 ([kernel.kallsyms])
__x64_sys_execve ([kernel.kallsyms])
do_syscall_64 ([kernel.kallsyms])
entry_SYSCALL_64 ([kernel.kallsyms])
#
ردیابی خطای صفحه جزئی بعدی که بر روی اولین پردازنده رخ میدهد:
# perf trace -F min --call-graph=dwarf --max-events 1 --cpu 0
0.000 ( 0.000 ms): Web Content/17136 minfault [js::gc::Chunk::fetchNextDecommittedArena+0x4b] => 0x7fbe6181b000 (?.)
js::gc::FreeSpan::initAsEmpty (inlined)
js::gc::Arena::setAsNotAllocated (inlined)
js::gc::Chunk::fetchNextDecommittedArena (/usr/lib64/firefox/libxul.so)
js::gc::Chunk::allocateArena (/usr/lib64/firefox/libxul.so)
js::gc::GCRuntime::allocateArena (/usr/lib64/firefox/libxul.so)
js::gc::ArenaLists::allocateFromArena (/usr/lib64/firefox/libxul.so)
js::gc::GCRuntime::tryNewTenuredThing<JSString, (js::AllowGC)1> (inlined)
js::AllocateString<JSString, (js::AllowGC)1> (/usr/lib64/firefox/libxul.so)
js::Allocate<JSThinInlineString, (js::AllowGC)1> (inlined)
JSThinInlineString::new_<(js::AllowGC)1> (inlined)
AllocateInlineString<(js::AllowGC)1, unsigned char> (inlined)
js::ConcatStrings<(js::AllowGC)1> (/usr/lib64/firefox/libxul.so)
[0x18b26e6bc2bd] (/tmp/perf-17136.map)
#
ردیابی دو رویداد sched:sched_switch بعدی، چهار رویداد block:*_plug، رویداد block:*_unplug بعدی و سه رویداد net:*dev_queue بعدی، مورد آخر با ردیابی بازگشتی (backtrace) با حداکثر ۱۶ مدخل، در سطح کل سیستم:
# perf trace -e sched:*switch/nr=2/,block:*_plug/nr=4/,block:*_unplug/nr=1/,net:*dev_queue/nr=3,max-stack=16/
0.000 :0/0 sched:sched_switch:swapper/2:0 [120] S ==> rcu_sched:10 [120]
0.015 rcu_sched/10 sched:sched_switch:rcu_sched:10 [120] R ==> swapper/2:0 [120]
254.198 irq/50-iwlwifi/680 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051f600 len=66
__dev_queue_xmit ([kernel.kallsyms])
273.977 :0/0 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051f600 len=78
__dev_queue_xmit ([kernel.kallsyms])
274.007 :0/0 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051ff00 len=78
__dev_queue_xmit ([kernel.kallsyms])
2930.140 kworker/u16:58/2722 block:block_plug:[kworker/u16:58]
2930.162 kworker/u16:58/2722 block:block_unplug:[kworker/u16:58] 1
4466.094 jbd2/dm-2-8/748 block:block_plug:[jbd2/dm-2-8]
8050.123 kworker/u16:30/2694 block:block_plug:[kworker/u16:30]
8050.271 kworker/u16:30/2694 block:block_plug:[kworker/u16:30]
#
نکات (NOTES)
- 1.
- addr.dso@addr.offset
- 2.
- dso@symbol
| 09/04/2026 | perf |